如何告诉Xstream仅序列化明确注释的字段并忽略其余字段?
我正在尝试序列化一个hibernate持久对象,并且所有与代理相关的字段都是序列化的,我不希望在我的xml中。 例如
<createdBy class="com..domain.Users " reference="../../values/createdBy"/>
在我的xml中不是我想要的东西。
编辑:我认为我没有明确这个问题。类可以继承自基类属性上无法控制的基类(如hibernate的情况)。
public class A {
private String ShouldNotBeSerialized;
}
public class B extends A {
@XStreamAlias("1")
private String ThisShouldbeSerialized;
}
在这种情况下,当我序列化B类时,基类字段 ShouldNotBeSerialized 也将被序列化。这不是我想要的。在大多数情况下,我无法控制A级。
因此,我希望默认省略所有字段,并仅序列化我明确指定注释的字段。我想避免GaryF正在做什么,我需要明确指定我需要省略的字段。
答案 0 :(得分:3)
您可以使用@XstreamOmitField注释omit fields。直接从手册:
@XStreamAlias("message")
class RendezvousMessage {
@XStreamOmitField
private int messageType;
@XStreamImplicit(itemFieldName="part")
private List<String> content;
@XStreamConverter(SingleValueCalendarConverter.class)
private Calendar created = new GregorianCalendar();
public RendezvousMessage(int messageType, String... content) {
this.messageType = messageType;
this.content = Arrays.asList(content);
}
}
答案 1 :(得分:3)
我不能赞同这个答案,只是分享我找到的东西。您可以覆盖XStream类的wrapMapper方法来实现您的需要。
此链接详细说明:http://pvoss.wordpress.com/2009/01/08/xstream/
如果您不想要解释,请输入以下代码:
// Setup XStream object so that it ignores any undefined tags
XStream xstream = new XStream() {
@Override
protected MapperWrapper wrapMapper(MapperWrapper next) {
return new MapperWrapper(next) {
@Override
public boolean shouldSerializeMember(Class definedIn,
String fieldName) {
if (definedIn == Object.class) {
return false;
}
return super
.shouldSerializeMember(definedIn, fieldName);
}
};
}
};
在实现此代码之前,您可能希望执行所有测试,因为默认XStream对象抛出的异常对于查找拼写错误很有用。
答案 2 :(得分:2)
XStream人已经有了一张票:
同样,这是设计的。 XStream是一个序列化工具,而不是数据 装订工具。它使Java对象序列化为XML并返回。它 会将任何内容写入XML,这是重新创建平等所必需的 对象图。生成的XML可以在某种程度上进行调整 为方便起见配置,但这已经是一个附加组件。你是什么 喜欢这样做可以通过实现自定义映射器来完成,但那是一个 用户列表的问题,无法在此处理。
答案 3 :(得分:1)
我想唯一的直接方法是深入编写MapperWrapper并排除所有未注释的字段。听起来像是XStream的功能请求。