【发布时间】:2014-11-11 10:32:55
【问题描述】:
Java 有一个瞬态关键字,它与默认序列化一起使用以指示不应序列化的值。但是,如果我将 XML 序列化与 XMLDecoder 一起使用,则与该字段关联的属性仍会被序列化。我用 Gson 库在 JSON 中尝试了同样的方法,并且瞬态字段似乎被正确跳过了。
有什么想法吗?
【问题讨论】:
标签: java xml xml-serialization transient xmltransient
Java 有一个瞬态关键字,它与默认序列化一起使用以指示不应序列化的值。但是,如果我将 XML 序列化与 XMLDecoder 一起使用,则与该字段关联的属性仍会被序列化。我用 Gson 库在 JSON 中尝试了同样的方法,并且瞬态字段似乎被正确跳过了。
有什么想法吗?
【问题讨论】:
标签: java xml xml-serialization transient xmltransient
XML 编码器/解码器支持@XMLTransient 注释。
transient 关键字用于以字节序列结束的 java 对象序列化过程。 XML“序列化”最终形成一个格式化的文本文档。当您选择一个不序列化的字段时可能会有不同的方面(通过将其标记为transient),并且由于输出完全不同,您可能想要选择要排除的不同字段并自己处理它们。例如,在 Java 序列化的情况下,您可能希望选择序列化 byte[],因为它简单明了。如果是 XML,您可能希望序列化用于创建该字节数组的对象,前提是它具有更好/更有意义的文本表示。
@XMLTransient 被JAXB 使用。要使XMLEncoder 排除字段(将其标记为瞬态),您必须在其PropertyDescriptor 中将"transient" 属性设置为TRUE: (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。
【讨论】:
XMLEncoder 没有。 @XMLTransient 用于 JAXB。编辑以澄清这一点并添加了一个示例如何使用XMLEncoder。