我只对反序列化感兴趣。 我有一些看起来像这样的数据:
<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类,应该单独定义为隐式集合的别名。
提前感谢您的帮助!
答案 0 :(得分:2)
查找@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