简单 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") 将抛出验证错误。