【问题标题】:XStream converting issue (different subclasses in the same list)XStream 转换问题(同一列表中的不同子类)
【发布时间】:2012-07-16 09:01:51
【问题描述】:

我只对反序列化感兴趣。 我有一些看起来像这样的数据:

     <Data>
        <Class name='ClassA'>
           <Object name='ObjectA'>
              <Relation name='RelationA'>
                  <toObject name='ObjectB'>
                  <toObject name='ObjectC'>
              </Relation>
           </Object>
           <Object name='ObjectB'>
              <Relation name='RelationB'>
                  <toObject name='ObjectA'>
                  <toObject name='ObjectC'>
              </Relation>
           </Object>
        </Class>
        <Class name='ClassB'>
           <Object name='ObjectC'>
              <Relation name='RelationC'>
                  <toObject name='ObjectB'>
              </Relation>
           </Object>
           <NotUsedRelations>
               <Relation name='RelationD'>
                  <toObject name='ObjectA'>
               </Relation>
           </NotUsedRelations>
        </Class>
    </Data> 

我想使用 Xstream 来阅读它,但我遇到了 NotUsedRelations 元素的问题:

    stream.alias("Data",     Model.class);
    stream.alias("Class",    Model.XMLClass.class);
    stream.alias("Object",   Model.XMLObject.class);
    stream.alias("Relation", Model.XMLRelation.class);
    stream.alias("toObject", Model.XMLObject.class);

Model 中的每个类型都从 XMLElement 抽象类扩展而来,该抽象类定义了带有 Name 的构造函数。然后他们都有一个

 List<XMLElement> subElements;

私有变量,以及他的 getter/setter。

问题是Class包含Object子元素以及NotUsedRelations的隐式集合,但Relationship和Objects都是扩展XMLElement,所以我想把它们放在subElements列表中

我用 stream.addImplicitCollection() 和 stream.aliasField() 尝试了不同的方法,但编译器总是报错

一个问题是一个类型是隐式集合而另一个不是,但 NotUsedRelations 没有真正的映射类,应该单独定义为隐式集合的别名。

提前感谢您的帮助!

【问题讨论】:

    标签: xml serialization alias converter xstream


    【解决方案1】:

    看看this question

    寻找@XStreamImplicit(itemFieldName = ...)的非注解方式如:

    @XStreamAlias("coins")
    public class Coins {
            @XStreamImplicit(itemFieldName="coin")
            List<String> coins = new ArrayList<String>();
    }
    

    另外看看@XStreamInclude处理子类问题的非注解方式,如:

    @XStreamInclude({
            UnionMoveSelectorConfig.class, CartesianProductMoveSelectorConfig.class,
            ChangeMoveSelectorConfig.class, SwapMoveSelectorConfig.class, PillarSwapMoveSelectorConfig.class,
            SubChainChangeMoveSelectorConfig.class, SubChainSwapMoveSelectorConfig.class,
            MoveListFactoryConfig.class, MoveIteratorFactoryConfig.class
    })
    public abstract class MoveSelectorConfig
    

    【讨论】:

      猜你喜欢
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      相关资源
      最近更新 更多