XStream转换问题(同一列表中的不同子类)

时间:2012-07-17 12:33:52

标签: xml serialization alias converter xstream

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

     <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;

private var,以及他的getter / setter。

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

我尝试使用stream.addImplicitCollection()和stream.aliasField()进行不同的操作,但编译器总是抱怨

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

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

看看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