Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gson-关于版本控制的问题_Java_Json_Serialization_Gson - Fatal编程技术网

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

Java Gson-关于版本控制的问题,java,json,serialization,gson,Java,Json,Serialization,Gson,我正在查看Gson用户指南的详细信息 问题1:它说可以在类、字段和(在将来的版本中)方法上使用@Since注释。我理解对象字段的序列化,但序列化类和方法意味着什么 问题2:它说当您创建Gson对象时,您可以指定一个版本,然后用@Since和大于该版本号的任何字段都将被忽略。这到底是什么意思?我知道,当Json包含反序列化到的Java类中不存在的额外字段时,这些字段将被忽略。那么,为什么您需要使用@Since注释呢?用于问题2: @因为主要帮助您进行序列化。版本号大于的字段将被忽略,因此您可以从当

我正在查看Gson用户指南的详细信息

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

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

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

@因为它对反现实化也有影响,在我看来不是很有用。如果使用的版本号小于某些字段,那么使用@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

对于Que 2。如果值数据类型发生了变化,这就是它与json解析不同的原因。这里分享了这个例子。