我已经自定义了对象的java序列化(通过readObject
和writeObject
)来省略属性以最小化群集节点之间的jgroups
流量,但我不想省略那些xml
生成/使用的xstream
中的属性。有没有办法控制xstream
使用的java序列化,这样我就不会省略这些属性?
答案 0 :(得分:0)
编辑:抱歉,我误解了您不想要省略字段的问题。
如果数据模型实现Serializable
且具有readObject
和writeObject
方法,则这些方法将由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省略字段。
false
@XStreamOmitField
XStream#omitField(Class definedIn, String fieldName)
答案 1 :(得分:0)
相关课程表格确实实施Serializable
并且有readObject
和writeObject
。
我最后注册了一个非常基本的转换器类,并发现在调用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);
}
}