简单 XML:抑制序列化数组中的长度属性
Simple XML: suppress length attribute in serialized arrays
像这样的 class 成员:
@ElementArray
private String[] names;
简单 XML 会将其序列化为:
<names length="3">
<string>Jonny Walker</string>
<string>Jack Daniels</string>
<string>Jim Beam</string>
</names>
有什么方法可以抑制封闭元素的 length
属性吗?
似乎没有直接的方法来做到这一点(请参阅 issue #39),但一个 hack 可以解决问题:可以内联列表(因此只会添加项目的元素,没有封闭元素及其不需要的属性)。然后,您可以添加一个带有 @Path
注释的“原始”封闭元素。数组不能直接内联,但您可以将它们转换为列表。
- 写一个getter其中returns数组为
List
.
- 将 getter 注释为
@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")
将抛出验证错误。
像这样的 class 成员:
@ElementArray
private String[] names;
简单 XML 会将其序列化为:
<names length="3">
<string>Jonny Walker</string>
<string>Jack Daniels</string>
<string>Jim Beam</string>
</names>
有什么方法可以抑制封闭元素的 length
属性吗?
似乎没有直接的方法来做到这一点(请参阅 issue #39),但一个 hack 可以解决问题:可以内联列表(因此只会添加项目的元素,没有封闭元素及其不需要的属性)。然后,您可以添加一个带有 @Path
注释的“原始”封闭元素。数组不能直接内联,但您可以将它们转换为列表。
- 写一个getter其中returns数组为
List
. - 将 getter 注释为
@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")
将抛出验证错误。