根据我对文档中定义的@Until注释的理解,它支持所有版本,直到注释中的包含版本为止。
文档:
public class User {
private String firstName;
private String lastName;
@Until(1.1) private String emailAddress;
@Until(1.1) private String password;
}
如果你用Gson gson = new创建了Gson GsonBuilder()。setVersion(1.2).create()然后是toJson()和 fromJson()方法的Gson将排除emailAddress和密码 上面示例中的字段,因为传递给的版本号 1.2的GsonBuilder超过了直到设置的版本号 注释,1.1,用于那些领域。
因此,如果我的gson是使用1.1版构建的,那么它应该显示该类的所有4个字段。但事实并非如此。
我的班级:
class TestData {
private String firstName;
@Since(1.1)
private String middleName;
@Until(1.1)
private String lastName;
}
测试代码:
TestData testData = new TestData();
testData.setFirstName("first");
testData.setMiddleName("middle");
testData.setLastName("last");
Gson versionGson = new GsonBuilder().setPrettyPrinting().setVersion(1.1).create();
System.out.println(versionGson.toJson(testData));
输出:
{
"firstName": "first",
"middleName": "middle"
}
输出中缺少 lastName
,即使注释值与Gson的版本匹配。
进一步调试我在gson代码下面找到this,这导致了这种行为。显然,根据代码,即使我的注释版本与传递给Gson的版本相匹配,它仍然被视为无效。
private boolean isValidUntil(Until annotation) {
if (annotation != null) {
double annotationVersion = annotation.value();
if (annotationVersion <= version) {
return false;
}
}
return true;
}
Doc,代码或我的理解是错误的吗?
答案 0 :(得分:0)
注释,指示成员或成员之前的版本号 类型应该存在。基本上,如果使用版本创建
Gson
超过Until
注释中存储的值的数字 将从JSON输出中忽略该字段。
但如果版本超过或等于您在@Until
中指定的版本,则code会返回“无效”。
这似乎是代码中的错误(如果您认为API规范是事实的来源)。我打开了issue来跟踪此事。
答案 1 :(得分:0)
我认为这在逻辑上不是问题,但是在Javadoc中是一个问题。
我认为这是因为@Until
应该采用排他值。这意味着@Until(6)
的所有版本值都应小于6
。否则,如果有任何修补程序版本。
例如,如果我使用@Until(5.5)
,并且希望它仅在5.x
版本之前有效。并且我有一个错误修复,并将版本设置为5.6
,那么我的整个逻辑将失败。