本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
1.x 和 2.x 之間的序列化差異 適用於 Java 的 AWS SDK
列出要請求參數差異的物件
適用於 Java 的 SDK v1.x 和 v2.x 在序列化清單物件以請求參數方面有所不同。
適用於 Java 的 SDK 1.x 不會序列化空白清單,而適用於 Java 的 SDK 2.x 會將空白清單序列化為空白參數。
例如,請考慮具有需要 SampleOperation之 的服務SampleRequest。SampleRequest 接受兩個參數:字串類型str1和清單類型listParam,如下列範例所示。
範例 1.x SampleOperation中的
SampleRequest v1Request = new SampleRequest() .withStr1("TestName"); sampleServiceV1Client.sampleOperation(v1Request);
線路層級記錄顯示 listParam 參數未序列化。
Action=SampleOperation&Version=2011-01-01&str1=TestName
範例 2.x SampleOperation中的
sampleServiceV2Client.sampleOperation(b -> b .str1("TestName"));
線路層級記錄顯示 listParam 參數已序列化,沒有值。
Action=SampleOperation&Version=2011-01-01&str1=TestName&listParam=
V1 POJOs 相較於 V2 中的建置器
由於適用於 Java 的 V1 開發套件使用可變 POJO 類別,因此序列化和還原序列化程式庫 - 例如 Jackson
相比之下,適用於 Java 的 V2 開發套件使用不可變的模型物件。您必須使用中繼建置器來執行去序列化。
下列範例顯示使用 Jackson 取消序列化具有 V1 和 V2 的 headBucket API 呼叫之間的差異ObjectMapper。
public void sendRequest() throws IOException { final String bucketName = "amzn-s3-demo-bucket"; final ObjectMapper mapper = new ObjectMapper(); // V1 uses POJOs to serialize and deserialize. final AmazonS3 v1S3Client = AmazonS3ClientBuilder.defaultClient(); HeadBucketResult resultV1 = v1S3Client.headBucket( new HeadBucketRequest(bucketName)); String v1Serialized = mapper.writeValueAsString(resultV1); HeadBucketResult deserializedV1 = mapper.readValue(v1Serialized, HeadBucketResult.class); // V2 uses builders to serialize and deserialize. S3Client v2S3Client = S3Client.create(); HeadBucketResponse v2Response = v2S3Client.headBucket( b -> b.bucket(bucketName)); String v2Serialized = mapper.writeValueAsString( v2Response.toBuilder()); HeadBucketResponse v2Deserialized = mapper.readValue( v2Serialized, HeadBucketResponse.serializableBuilderClass()) .build(); }