当前位置: 首页 > 知识库问答 >
问题:

XStream隐式集合配置问题

穆浩皛
2023-03-14

我正在使用一个生成这种类型XML的系统

<address>
  <addressLine>123 Main Street</addressLine>
  <addressLine>Suite 123</addressLine>
  <city>Test City</city>
  <stateOrProvince>AA</stateOrProvince>
  <postalCode>00000</postalCode>
</address>

另一个用例是集合、数组和映射。如果一个类有一个属于这些类型之一的字段,默认情况下,它的所有元素都嵌入到表示容器对象本身的元素中。通过使用XStream.AdditmplicitCollection()XStream.AdditmplicitArray()XStream.AdditmplicitMap()方法配置XStream,可以将元素直接保留为类的子元素,并且省略容器对象的周围标记。甚至可以为一个类声明多个隐式集合、数组或映射,但元素必须是可区分的,以便在反序列化时正确填充不同的容器。

在下面的示例中,表示farm的Java类型可能有两个容器,一个用于猫,一个用于狗:

<farm>
  <cat>Garfield</cat>
  <cat>Arlene</cat>
  <cat>Nermal</cat>
  <dog>Odie</dog>
</farm>

但是,这个SO回答表明XStream场示例是不可能的。

XStream xstream = new XStream(new StaxDriver());        
xstream.alias("address", Address.class);
xstream.alias("addressLine", String.class);     
xstream.addImplicitCollection(Address.class, "addressLines");       

Address address = (Address) xstream.fromXML( 
    new FileInputStream("src/test/resources/addressTest.xml"));

是否有其他配置更改我应该尝试?

注意:我目前使用的是XStreamV1.2.2。

共有1个答案

饶德本
2023-03-14

首先,如果可能的话,您应该升级到2007年发布的较新的XStream-1.2.2。但要回答您的问题,请尝试:

XStream xstream = new XStream(new StaxDriver());
xstream.alias("address", Address.class);
xstream.addImplicitCollection(Address.class, "addressLines", "addressLine", String.class);

这意味着将名称为AddressLine的所有元素视为字符串,并将它们聚集到AddressLine集合(即someAddress.getAddressLines())中。

 类似资料:
  • 但我得到了这个错误: 我读过这篇关于隐式集合的文章,认为XStream认为我的两个项是列表(隐式集合)的一部分,而实际上它们不是(它们应该映射到两个不同的属性)。 我怎么解决这个?提前道谢!

  • 我一直在玩Python 3.10中的结构模式匹配,但不知道如何让它匹配一组。例如,我尝试过: 我尝试过: 以及: 我想有一种方法可以做到这一点,因为我们可以匹配其他对象,我只是缺少正确的语法,但我想不出还有什么其他方法可以尝试。任何帮助都将不胜感激!谢谢

  • 我知道我们需要有至少3个服务器的mongo副本集,但我试图配置mongo DB副本集只有两个服务器,如果我想添加一个aribter节点。请让我知道我可以在哪里添加仲裁器节点,以及如何使用那些(主-次-树)配置来配置副本集

  • 问题内容: 我有一个需要序列化为XML的对象,其中包含以下字段: XStream可以很好地序列化它(在使用一些别名之后),如下所示: 就目前而言还可以,但是我希望能够将元素重命名为。从XStream站点上的别名文档中,我看不到一种明显的方法。我是否缺少明显的东西? 问题答案: 我建议将更改为,其中Tag是本质上仅包含字符串的域对象。然后你说: 您将得到您想要的。这样可以避免滚动自己的Convert

  • 问题内容: 我正在使用JavaConverters将Java SortedSet转换为Vector。 我的getInstructions函数返回java.lang.Long的ArrayList,但是使用代码需要Scala.Long。有没有一种方法可以在不将所有使用代码都更改为使用Java.lang.Long的情况下进行操作? 此外,是否有一种方法可以对值类进行隐式转换,以允许对ArrayList的