java - Gson - 关于版本控制的问题

标签 java json serialization gson

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

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

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

最佳答案

对于问题 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

关于java - Gson - 关于版本控制的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13714676/

相关文章:

java - Selenium WebDriver 和 Highchart 测试

java - 多级继承中调用哪个版本的方法?

json - R:将 JSON 通用扁平化为 data.frame

json - Jackson 将子类序列化为父类中的字段

c# - 如何在 .NET Core 和 .NET Framework 应用程序之间干净地发送数据,并使用 Json.NET 进行序列化?

java - 使用 javafxplugin 和 hibernate 时无法在 IDE 外部运行 JavaFX 应用程序

java - 我应该从正在使用的主要 Activity 中访问 fragment 中的内容吗?

ruby-on-rails - rails : form_for with json: undefined method to_model for Hash

json - 解码 JSON 返回空结构

javascript - PDO 和序列化