今天,我遇到了XStream的奇怪行为。因此,XML:
<AddressObjectType KOD_T_ST="0" LEVEL="0" SOCRNAME="blabla"/>
Java类:
@XStreamAlias("AddressObjectType")
public class AddressObjectType {
@XStreamAsAttribute
@XStreamAlias("KOD_T_ST")
private Integer id;
@XStreamAsAttribute
@XStreamAlias("SOCRNAME")
private String name;
@XStreamAsAttribute
@XStreamAlias("SCNAME")
private String shortName;
@XStreamAsAttribute
@XStreamAlias("LEVEL")
private int level;
// . . . getters, setters
}
我仅对属性KOD_T_ST
有疑问。反序列化期间始终抛出com.thoughtworks.xstream.converters.ConversionException
,原因为NullPointerException
。属性值始终为null
。甚至我将类型从Integer
切换到String
。
到底是怎么回事? XStream是否对别名具有任何限制?如何读取价值?
XStream版本1.4.11.1。
非常感谢您的帮助和问候。
答案 0 :(得分:1)
您现有的xml字符串有问题
<AddressObjectType KOD_T_ST="0" LEVEL="0" SOCRNAME="blabla"/>
代替下面的方法,而使用下面的方法,它将起作用,AddressObjectType对象模型没有变化。标记不同之处,我提供的xml中有两个下划线(__)。
<AddressObjectType KOD__T__ST="0" LEVEL="0" SOCRNAME="blabla"/>
要了解,请参阅下面的链接。 http://x-stream.github.io/faq.html#XML_double_underscores
要引用,
为什么字段名称突然在生成的字段中带有双下划线 XML? XStream将Java类名称和字段名称映射到XML标记或 属性。不幸的是,这种映射不能为1:1,因为有些 Java名称中用于标识符的字符在XML名称中无效。 因此,XStream使用XmlFriendlyNameCoder替换这些 字符替换。默认情况下,此NameCoder使用 下划线为转义字符,因此必须转义 也强调自己。您可以提供其他配置 XmlFriendlyNameCoder的实例或完全不同的实例 NoNameCoder之类的实现完全杜绝名称编码。 但是,您有责任确保 名称对XML有效。