gpt4 book ai didi

java - 简单 XML : suppress length attribute in serialized arrays

转载 作者:行者123 更新时间:2023-12-01 21:10:24 24 4
gpt4 key购买 nike

以这样的类(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,将数组作为 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") 将引发验证错误。

关于java - 简单 XML : suppress length attribute in serialized arrays,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58905843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com