Xstream:隐含地忽略所有字段

时间:2010-01-04 08:46:56

标签: java xml xstream

如何告诉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正在做什么,我需要明确指定我需要省略的字段。

4 个答案:

答案 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可以在某种程度上进行调整   为方便起见配置,但这已经是一个附加组件。你是什​​么   喜欢这样做可以通过实现自定义映射器来完成,但那是一个   用户列表的问题,无法在此处理。

http://jira.codehaus.org/browse/XSTR-569

答案 3 :(得分:1)

我想唯一的直接方法是深入编写MapperWrapper并排除所有未注释的字段。听起来像是XStream的功能请求。