本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
的 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(); }