Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.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:如何使用@Since注释,例如“version”;1.2.1“;?(无效双精度)_Java_Android_Double_Gson - Fatal编程技术网

Java 谷歌GSON:如何使用@Since注释,例如“version”;1.2.1“;?(无效双精度)

Java 谷歌GSON:如何使用@Since注释,例如“version”;1.2.1“;?(无效双精度),java,android,double,gson,Java,Android,Double,Gson,我正在Java应用程序中使用 设想以下情况:在版本1.2.1中添加了一个新的JSON属性。如何在注释中使用此选项?显然,@Since(1.2.1)是不可能的,因为1.2.1不是有效的双精度编码。我的版本格式是。 我注意到的另一件事是,如果我有版本1.20,GSON将其视为比例如版本1.3更低的版本 有什么办法解决这个问题吗?也许可以做一些像定制排他性的工作?(这是否存在?) 除了版本问题,我注意到注释也可以用于类。我找不到关于这个的任何文档。如果有人能解释一下为什么这很有用,我将不胜感激。这看起

我正在Java应用程序中使用

设想以下情况:在版本
1.2.1
中添加了一个新的JSON属性。如何在注释中使用此选项?显然,
@Since(1.2.1)
是不可能的,因为
1.2.1
不是有效的双精度编码。我的版本格式是

我注意到的另一件事是,如果我有版本
1.20
,GSON将其视为比例如版本
1.3
更低的版本

有什么办法解决这个问题吗?也许可以做一些像定制排他性的工作?(这是否存在?)


除了版本问题,我注意到注释也可以用于类。我找不到关于这个的任何文档。如果有人能解释一下为什么这很有用,我将不胜感激。

这看起来像是
,因为
注释有点有限,不适合您。您需要自定义排除策略是正确的。类似于以下的方法将起作用:

  • 为要使用的版本创建自己的注释,而不是
    @因为

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.FIELD, ElementType.TYPE})
    @interface VersionAnnotation {
        String versionNumber();
    }
    
  • 自定义排除策略:

    class VersionExclusionStrategy implements ExclusionStrategy {
    
        private String versionNumber;
    
        VersionExclusionStrategy(String versionNumber) {
            this.versionNumber = versionNumber;
        }
    
        @Override
        public boolean shouldSkipClass(Class<?> classType) {
            VersionAnnotation va = classType.getAnnotation(VersionAnnotation.class);
    
            return va != null && versionCompare(this.versionNumber, va.versionNumber()) < 0;
        }
    
        @Override
        public boolean shouldSkipField(FieldAttributes fieldAttributes) {
            VersionAnnotation va = fieldAttributes.getAnnotation(VersionAnnotation.class);
    
            return va != null && versionCompare(this.versionNumber, va.versionNumber()) < 0;
        }
    
        private static int versionCompare(String str1, String str2) {
            // TODO implement
        }
    }
    

  • 我不确定这对课堂有什么用处。您可以对该类进行注释,这样就不必对其他类中的所有类引用进行注释,但仅此而已。

    谢谢,我已经让它正常工作了。我已经意识到默认的
    ,因为
    注释不起作用,它太有限了。类的注释实际上非常方便。如果在较新的API版本中引入了一个新的“特性”,我可以只注释类而不是每个新字段。那样的话可读性会更好。
    
    Gson gson = new GsonBuilder().setExclusionStrategies(new VersionExclusionStrategy("1.3")).create();