繁体   English   中英

Gson - 关于版本控制的问题

[英]Gson - questions about versioning

我正在查看Gson用户指南的版本支持部分

问题1:它表示您可以在类,字段和(在将来的版本中)方法中使用@Since批注。 我理解对象字段的序列化,但序列化方法意味着什么?

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

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

@Since也影响了deserealization,在我看来并不那么有用。 使用@Since进行deserealization将忽略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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM