采取这样的班级成员:
@ElementArray
private String[] names;
简单XML会将其序列化为:
<names length="3">
<string>Jonny Walker</string>
<string>Jack Daniels</string>
<string>Jim Beam</string>
</names>
有什么方法可以抑制包围元素的length
属性?
似乎没有一种简单的方法,但是可以通过黑客来完成:可以内联列表(因此,将仅添加项目的元素,而无需包含元素及其不需要的属性)。然后,您可以添加带有@Path
批注的“原始”封闭元素。数组不能直接内联,但是您可以将它们转换为列表。
List
返回的吸气剂。@ElementList(inline=true)
和@Path("names")
。@Default
批注,则将数组注释为@Transient
,这样就不会被序列化两次。喜欢这个:
@Transient
private String[] names;
@ElementList(inline=true)
@Path("names")
public List<String> getNamesAsList() {
if (names == null)
return null;
else
return Arrays.asList(names);
}
然后将产生:
<names>
<string>Jonny Walker</string>
<string>Jack Daniels</string>
<string>Jim Beam</string>
</names>
您必须为反序列化添加一些额外的魔术,可能是constructor injection。 (由于在我的情况下,数组为final
,所以我还是需要它。)
如果需要反序列化,则需要对序列化的相同元素进行反序列化。也就是说,@ElementList(inline=true) @Path("names")
将起作用,而例如@ElementList(name="names")
将引发验证错误。