为什么XMLDecoder不尊重transient关键字?

时间:2014-09-17 11:46:34

标签: java xml xml-serialization transient xmltransient

Java有一个transient关键字,用于默认序列化以指示不应序列化的值。但是,如果我对XMLDecoder使用XML序列化,则仍然会序列化与该字段关联的属性。我在JSON中使用Gson库尝试了相同的操作,并且似乎正确地跳过了瞬态字段。

任何想法为什么?

1 个答案:

答案 0 :(得分:2)

XML编码器/解码器支持@XMLTransient注释。

transient关键字用于java对象序列化过程,该过程以字节顺序结束。 XML“序列化”最终出现在格式化的文本文档中。当您选择不进行序列化的字段(通过标记transient)时可能会有不同的方面,并且由于输出完全不同,您可能希望选择要排除的不同字段并自行处理它们。例如,在Java序列化的情况下,您可能希望选择序列化byte[],因为它简单明了。在XML的情况下,如果它具有更好/更有意义的文本表示,您可能希望序列化用于创建该字节数组的对象。

JAXB使用

@XMLTransient。要让XMLEncoder排除字段(将其标记为瞬态),您必须在"transient"中设置TRUE属性为PropertyDescriptor :( source

BeanInfo info = Introspector.getBeanInfo(JTextField.class);
PropertyDescriptor[] propertyDescriptors =
                             info.getPropertyDescriptors();
for (int i = 0; i < propertyDescriptors.length; ++i) {
    PropertyDescriptor pd = propertyDescriptors[i];
    if (pd.getName().equals("text")) {
        pd.setValue("transient", Boolean.TRUE);
    }
}

这不是一个优雅的解决方案。另一种方法是使用JAXB代替XMLEncoder