如果我不希望xstream使用对象的readObject / writeObject实现,该怎么办?

时间:2014-05-21 11:55:53

标签: xstream

我已经自定义了对象的java序列化(通过readObjectwriteObject)来省略属性以最小化群集节点之间的jgroups流量,但我不想省略那些xml生成/使用的xstream中的属性。有没有办法控制xstream使用的java序列化,这样我就不会省略这些属性?

2 个答案:

答案 0 :(得分:0)

编辑:抱歉,我误解了您想要省略字段的问题。

如果数据模型实现Serializable且具有readObjectwriteObject方法,则这些方法将由XStream自动调用,或者更精确地由SerializationMethodInvoker#callReadObject和{{1}调用}。我没有看到任何配置标志来避免这些调用。

此外,瞬态字段会自动省略。见SerializationMethodInvoker#callWriteObject

AbstractReflectionConverter#shouldUnmarshalField

    protected boolean shouldUnmarshalField(final Field field) {
        return !(Modifier.isTransient(field.getModifiers()) && !shouldUnmarshalTransientFields());
}

因此,没有配置标记可以避免每次protected boolean shouldUnmarshalTransientFields() { return false; } 都返回shouldUnmarshalTransientFields;

有许多方法可以使用XSream省略字段。

  1. 通过注释:false
  2. 通过配置XStream对象:@XStreamOmitField
  3. 使用Java的语法:XStream#omitField(Class definedIn, String fieldName)

答案 1 :(得分:0)

相关课程表格确实实施Serializable并且有readObjectwriteObject

我最后注册了一个非常基本的转换器类,并发现在调用toXML时没有调用writeObject。这似乎是我在寻找的东西。我现在可以省略jgroups序列化流中的某些属性(通过writeObject),这些属性不会从xtream生成的xml中省略。

这是我的转换器类......

package foo.form;

import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.converters.javabean.JavaBeanConverter;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.mapper.Mapper;

public class FormConverter extends JavaBeanConverter {

    public FormConverter(Mapper mapper) {
        super(mapper);
    }

    @Override
    public boolean canConvert(Class clazz) {
        return Form.class == clazz;
    }

    @Override
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
        super.marshal(source, writer, context);
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        return super.unmarshal(reader, context);
    }
}