

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 1.x 和 2.x 之间的序列化差异 适用于 Java 的 AWS SDK
<a name="migration-serialization-changes"></a>

## 列出请求对象的参数差异
<a name="serialization-diffs-list-obj-to-req-param"></a>

SDK for Java v1.x 和 v2.x 的不同之处在于它们如何序列化列表对象以请求参数。

SDK for Java 1.x 不会序列化空列表，而 SDK for Java 2.x 会将空列表序列化为空参数。

例如，假设一项服务具有 `SampleOperation`，会接收 `SampleRequest`。`SampleRequest` 接受两个参数，字符串类型 `str1` 和列表类型 `listParam`，如以下示例所示。

**Example 1.x 中 `SampleOperation` 的示例**  

```
SampleRequest v1Request = new SampleRequest()
    .withStr1("TestName");

sampleServiceV1Client.sampleOperation(v1Request);
```
线级日志记录显示 `listParam` 参数未序列化。  

```
Action=SampleOperation&Version=2011-01-01&str1=TestName
```

**Example 2.x 中 `SampleOperation` 的示例**  

```
sampleServiceV2Client.sampleOperation(b -> b
    .str1("TestName"));
```
线级日志记录显示 `listParam` 参数进行了序列化，没有任何值。  

```
Action=SampleOperation&Version=2011-01-01&str1=TestName&listParam=
```

## POJOs 在 V1 中与 V2 中的构建器相比
<a name="serialization-json-objects"></a>

由于适用于 Java 的 SDK V1 使用可变的 POJO 类，因此序列化和反序列化库（例如 [Jackson](https://github.com/FasterXML/jackson-docs)）可以直接使用模型对象。

相比之下，适用于 Java 的 SDK V2 使用不可变的模型对象。必须使用中间生成器来执行反序列化/序列化。

以下示例显示了 V1 的 `headBucket` API 调用和使用 Jackson 的 V2 调用之间的 de/serializing 区别。`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();
    }
```