简单XML:抑制序列化数组中的length属性

问题描述 投票:0回答:1

采取这样的班级成员:

@ElementArray
private String[] names;        

简单XML会将其序列化为:

<names length="3">
   <string>Jonny Walker</string>
   <string>Jack Daniels</string>
   <string>Jim Beam</string>
</names>

有什么方法可以抑制包围元素的length属性?

java xml-serialization simple-framework
1个回答
0
投票

似乎没有一种简单的方法,但是可以通过黑客来完成:可以内联列表(因此,将仅添加项目的元素,而无需包含元素及其不需要的属性)。然后,您可以添加带有@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")将引发验证错误。

© www.soinside.com 2019 - 2024. All rights reserved.