我的一个班级中有以下代码:
@Text(required=false)
@ElementListUnion({
@ElementList(required = false, inline = true, type = com.company.Child.class, entry="values")
})
public List<Object> valueUnion;
请注意,这似乎是让框架使用包含子项和文本的元素的唯一方法。当文本存在且元素列表也包含元素时,这很有用,并产生以下xml:
<parent>
<values>val 1</values>
<values>val 2</values>
some text
</parent>
但是,有时元素列表不包含元素,只有文本存在(意味着valueUnion List只包含一个元素,即文本字符串)。但是,这会产生以下XML:
<parent>
<values />
some text
</parent>
这就是问题所在,因为这会导致服务器阻塞空的<values />
标记。不幸的是我无法控制服务器上的代码,我正在寻找一种方法来强制Simple忽略空标记,如果elementlist不包含任何元素。
答案 0 :(得分:2)
我有一个解决方法。它不漂亮,但这个概念可以帮到你。
除了元素注释,您还可以使用自定义Converter
来自定义对象。
Example
上课: (包含您需要的列表,文本和其他元素)
@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
)。
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>
如前所述,请注意形成“问题”!