【问题标题】:Why doesn't XMLDecoder respect the transient keyword?为什么 XMLDecoder 不尊重瞬态关键字?
【发布时间】:2014-11-11 10:32:55
【问题描述】:

Java 有一个瞬态关键字,它与默认序列化一起使用以指示不应序列化的值。但是,如果我将 XML 序列化与 XMLDecoder 一起使用,则与该字段关联的属性仍会被序列化。我用 Gson 库在 JSON 中尝试了同样的方法,并且瞬态字段似乎被正确跳过了。

有什么想法吗?

【问题讨论】:

    标签: java xml xml-serialization transient xmltransient


    【解决方案1】:

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

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

    @XMLTransientJAXB 使用。要使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

    【讨论】:

    • 您可能希望使用相同的类进行 Java 序列化和 XML 编码。如果您只有 1 个关键字或标记排除字段的方式,则无法为这 2 个目的有所作为。
    • 是的,XMLEncoder 没有。 @XMLTransient 用于 JAXB。编辑以澄清这一点并添加了一个示例如何使用XMLEncoder
    • 对。我知道这件事。我需要在运行时遍历属性以指示它。这只是延迟,因为 Java 有一个 transient 关键字。
    猜你喜欢
    • 2020-06-03
    • 2018-10-27
    • 2020-10-11
    • 2016-05-23
    • 2010-10-28
    • 2015-04-12
    • 2013-10-17
    • 2015-03-14
    相关资源
    最近更新 更多