【发布时间】:2023-09-22 02:45:01
【问题描述】:
我想用 XStream 将一个对象序列化为这种形式的 XML。
<node att="value">text</node>
节点的值(text)是序列化对象上的一个字段,以及att属性。如果不为此对象编写转换器,这可能吗?
谢谢!
【问题讨论】:
我想用 XStream 将一个对象序列化为这种形式的 XML。
<node att="value">text</node>
节点的值(text)是序列化对象上的一个字段,以及att属性。如果不为此对象编写转换器,这可能吗?
谢谢!
【问题讨论】:
您可以使用预定义的转换器。
@XStreamAlias("node")
@XStreamConverter(value=ToAttributedValueConverter.class, strings={"text"})
class Node {
private String att;
private String text;
}
XStream Annotations Tutorial 也表示 att 属性:
注意,不需要 XStreamAsAttribute 注释。这 转换器隐含地假定它。
【讨论】:
@XmlValue 注释的 @XStreamValue 注释。
写一个转换器,应该是类似sn-p的代码
class FieldDtoConvertor implements Converter {
@SuppressWarnings("unchecked")
public boolean canConvert(final Class clazz) {
return clazz.equals(FieldDto.class);
}
public void marshal(final Object value,
final HierarchicalStreamWriter writer,
final MarshallingContext context) {
final FieldDto fieldDto = (FieldDto) value;
writer.addAttribute(fieldDto.getAttributeName(), fieldDto.getAttributeValue());
}
}
在使用 XStream 时,注册转换器
final XStream stream = new XStream(new DomDriver());
stream.registerConverter(new FieldDtoConvertor());
【讨论】:
这在 JAXB 中要容易得多
@XmlRootElement
public class Node {
@XmlAttribute
String att;
@XmlValue
String value;
}
【讨论】:
只是另一种方式:
@XStreamAlias("My")
private static class My {
private String field;
}
XStream xStream = new XStream();
xStream.autodetectAnnotations(true);
xStream.useAttributeFor(My.class, "field");
【讨论】: