【问题标题】:Gson - questions about versioningGson - 关于版本控制的问题
【发布时间】:2012-12-05 00:59:02
【问题描述】:

我正在查看 Gson 用户指南的 Versioning Support section

问题 1:它说您可以在类、字段和(在将来的版本中)方法上使用 @Since 注释。我了解对象字段的序列化,但是序列化一个和一个方法是什么意思?

问题2:它说当你创建你的Gson对象时,你可以指定一个版本,然后任何带有@Since注解的字段和一个大于那个版本号的字段都会被忽略。这到底是什么意思?我知道,当 Json 包含正在反序列化的 Java 类中不存在的额外字段时,这些字段将被忽略。那么为什么需要使用 @Since 注释呢?

【问题讨论】:

标签: java json serialization gson


【解决方案1】:

对于问题 2: @Since 主要帮助您进行序列化。版本号更大的字段将被忽略,因此您可以从当前较新的类中为以前的版本编写 JSON。

@Since 对去现实化也有影响,在我看来不是那么有用。使用 @Since 进行反现实化将忽略 JSON 中存在的一些字段以及类中存在的一些字段,如果使用的版本号少于这些字段。在我看来这没什么用,因为您在新课程中阅读新版本的 JSON 就像在新课程中阅读旧版本的 JSON。

JSON 示例:

{
    oldField: "value1",
    newField: "value2"
}

Java 类:

class MyClass {
    @Since(0.0)
    public String oldField;
    @Since(1.0)
    public String newField;
}

Java 测试:

public static void main(String[] args) {
    Gson gson = new GsonBuilder().setVersion(0.0).create();
    MyClass myClass = gson.fromJson("{oldField: \"value1\", newerField: \"value2\"}", MyClass.class);

    System.out.println("read as version 0.0:");
    System.out.println(myClass.oldField);
    System.out.println(myClass.newField);


    Gson gson2 = new GsonBuilder().create();
    MyClass myClass2 =  gson2.fromJson("{oldField: \"value1\", newField: \"value2\"}", MyClass.class);

    System.out.println("read without version specified:");
    System.out.println(myClass2.oldField);
    System.out.println(myClass2.newField);
}

结果显示如果@Since 更小,newField 是如何被忽略的:

read as version 0.0
value1
null

read without version specified
value1
value2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多