我有一个解决方法给你。它并不漂亮,但这个概念可以帮助你。您可以使用序列化对象
的自定义来代替元素注释。Converter
(包含您需要的列表、文本和其他元素)
@Root(name="parent")
@Convert(ExampleConverter.class)
public class Example
{
private String text; // Save the text you want to set ('some text' in your code)
private List<Object> valueUnion;
// Constructor + getter / setter
}
实际上你只需要这里的@Convert(ExampleConverter.class)
和@Root
注解,因为序列化是在你自己的转换器(ExampleConverter
)中完成的。
(在此处序列化/反序列化您的对象)
public class ExampleConverter implements Converter
{
@Override
public Object read(InputNode node) throws Exception
{
/* TODO: Deserialize your class here (if required). */
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void write(OutputNode node, Object value) throws Exception
{
final Example val = (Example) value;
final List<Object> l = val.getValueUnion();
if( !l.isEmpty() ) // if there are elements, insert their nodes
{
for( Object obj : l )
{
node.getChild("values").setValue(obj.toString());
}
}
else
{
node.getChild("values").setValue(""); // this creates <values></values> if list is empty
}
node.setValue(val.getText()); // Set the text (1)
}
}
(1):即使有其他元素,这也会设置您的文本。但是,此解决方案可能会破坏您的格式;文本和结束标签将在同一行。您可以通过插入新行来解决此问题。
创建一个序列化程序,设置您的策略并写入/读取
Serializer ser = new Persister(new AnnotationStrategy()); // 'AnnotationStrategy is important here!
ser.write(...); // write / read
使用列表中的元素:
Example t = new Example();
t.setText("abc"); // Set the text
t.getValueUnion().add("value1"); // Add some elements to list
t.getValueUnion().add("value2");
Serializer ser = new Persister(new AnnotationStrategy());
ser.write(t, f); // 'f' is the file to write
输出:
<parent>
<values>value1</values>
<values>value2</values>abc</parent>
列表中没有元素:
Example t = new Example();
t.setText("abc"); // Set the text
Serializer ser = new Persister(new AnnotationStrategy());
ser.write(t, f); // 'f' is the file to write
输出:
<parent>
<values></values>abc</parent>
请注意前面所说的格式化“问题”!