您可以使用Converter-实现来执行此操作。这允许您自己实现(反)序列化的过程。
这里有一个建议:
- 作为所有对象(人、汽车等)基础的抽象类
- 为那些实现
- 包含所有其他元素的根对象
-
Converter 从节点创建具体的根对象
顺便说一句。如果您使用转换器,则不必添加那些简单的注释 - 但是,这始终是一个好主意,以防万一您需要它们。
(抽象)所有对象的基类:
@Root()
public abstract class ObjectElement
{
@Attribute(name = "id")
private String id;
public ObjectElement(String id)
{
this.id = id;
}
// ...
}
人物类:
@Root(name = "object")
public class PersonObject extends ObjectElement
{
@Element(name = "name")
private String name;
public PersonObject(String name)
{
super("person");
this.name = name;
}
// ...
}
汽车类:
@Root(name = "object")
public class CarObject extends ObjectElement
{
@Element(name = "model")
private String model;
public CarObject( String model)
{
super("car");
this.model = model;
}
// ...
}
序列类:
@Root(name = "sequence")
public class SequenceObject extends ObjectElement
{
@ElementList(inline = true)
private final List<ObjectElement> elements;
public SequenceObject()
{
super("personSequence");
this.elements = new ArrayList<>();
}
// ...
}
root-元素;它有它的子元素(汽车等)的实例并映射<root> ... </root> 元素。
@Root(name = "root")
@Convert(RootElementConverter.class) // Set Converter here!
public class RootElement
{
private final List<ObjectElement> elememts;
public RootElement()
{
this.elememts = new ArrayList<>();
}
public void add(ObjectElement element)
{
this.elememts.add(element);
}
// ...
}
Converter:
public class RootElementConverter implements Converter<RootElement>
{
@Override
public RootElement read(InputNode node) throws Exception
{
RootElement root = new RootElement();
/*
* Iterate over all nodes and add them to root. You can use
* "node.getName()" and "node.getAttribute(...)" to test what
* instance you have to add.
*
* Use "root.add(...)" to add nodes.
*/
return root;
}
@Override
public void write(OutputNode node, RootElement value) throws Exception
{
/*
* Implement this if you also serialize to xml.
*/
throw new UnsupportedOperationException("Not supported yet.");
}
}
最后如何调用:
final String xml = ...
// Important: Don't forget the AnnotationStrategy!
Serializer ser = new Persister(new AnnotationStrategy());
// Read root-object from xml-string or whatever
RootElement root = ser.read(RootElement.class, xml);