gpt4 book ai didi

java - 为 XStream 中不在 XML 中的字段设置默认值

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:15:17 30 4
gpt4 key购买 nike

有没有办法创建一个转换器或在每次转换后执行的某些操作?对于上下文,我试图为不在我的 XML 中的字段填充默认值,以便在我的数据模型发生变化时保持向后兼容性。例如,如果我有这个对象:

class A {
private String b;
private String c;
private String d;
}

我的 XML 是这样的:

<a>
<b>b</b>
<d>d</d>
</a>

我希望我的 XML 导入知道字段 c 的默认值为 "c" 并将其设置为 A 就这样。这应该是一个通用操作,我可以将默认值添加到非常复杂的图形的任何字段。如果有某种方法可以在每次转换后触发一个函数,它可以根据我想为其设置默认值的对象映射检查当前对象。

另请注意,使用 readResolve/readObject 似乎不是一个选项,因为 1.readObject() 似乎根本不适合我,2.readResolve 会用默认值覆盖该字段,即使它实际上包含在内在 XML 中。如果我的假设有误,请告诉我。

编辑:我在用户邮件列表中找到了这个相关的帖子: http://article.gmane.org/gmane.comp.java.xstream.user/4619/match=default+value

似乎唯一建议的解决方案是使用 readResolve(),我已经说过这不是一个有效的解决方案。

最佳答案

使用 PureJavaReflectionProvider

XStream xstream = new XStream(new PureJavaReflectionProvider());

然后像往常一样用默认值初始化你的对象。通过字段初始化或构造函数代码(初始化程序)。

背景

如果不指定 ReflectionProvider xstream 试图找到最好的反射提供者。但是 xstream 的最佳 ReflectionProvider 可能不是最适合您的,因为它通常选择 Sun14ReflectionProvider

Sun14ReflectionProvider使用与 java 序列化机制相同的实例化策略,这意味着它跳过构造函数代码或更准确地说 - 对象初始化代码。

因此实例字段初始化如

class A {
private String b = "DEFAULT";
}

不会被应用,构造函数代码也不会被应用,例如

class A {
private String b;

public A(){
b = "DEFAULT";
}
}

PureJavaReflectionProvider 使用(顾名思义)java 反射 API 来实例化对象,例如Class.newInstance()因此执行对象初始化代码。

关于java - 为 XStream 中不在 XML 中的字段设置默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16060804/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com