【问题标题】:Java Serializable (are all variables affected?)Java Serializable(所有变量都受影响吗?)
【发布时间】:2011-11-16 02:49:48
【问题描述】:

我想知道属性foo是否也会在下面的例子中被序列化(写在我的脑海里):

public class Example implements Serializable {
     private String a = "a";
     private Foo foo = new Foo("a");
}

注意:类 Foo 只拥有一个属性 a 并且 实现 Serializable

如果Foo 不可序列化,我还有另一个问题,即 Foo 无法实现 Serializable,因为它是由来自外部 .jar 文件的 Api 调用提供的。 同样在我的具体情况下,Foo 还拥有一个类 Bar,它也不是 Serializable

【问题讨论】:

    标签: java parsing serialization object


    【解决方案1】:

    如果Foo 不可序列化,则尝试使用非空foo 序列化Example 实例将导致NotSerializableException,除非foo 被声明为transient

    您只需尝试一下就可以很容易地发现这一点。

    更新: 为了在您无法更改Foo 但需要保留其内容时能够序列化Example 的实例,您可以实现API doc of Serializable 中描述的readObject()writeObject() 方法

    【讨论】:

      【解决方案2】:

      如果foo实例不是SerializableExample的序列化将在运行时失败-试试吧!

      您可以通过提供readObjectwriteObject 方法来提供Example 的自定义序列化形式。

      【讨论】:

      • 谢谢。无论如何......现在我有另一个问题 - Foo 无法实现可序列化,因为该类是由来自外部 .jar 的 Api 调用提供的。将Foo 子类化为SerializableFoo (实现Selializable)之类的东西都不起作用,因为我不能从超类转换为子类(关于stackoverflow.com/questions/4862960/…
      • @gluca 您需要弄清楚如何将 Foo 转换为字节序列(或可序列化对象)并返回,然后将其放入(或从中调用)Example readObjectwriteObject.
      【解决方案3】:

      如果Foo 不可序列化,尝试序列化Example 实例将引发运行时异常。您需要使其可序列化,或将 foo 字段标记为 transient。但在后一种情况下,反序列化示例时,foo 将为 null。

      【讨论】:

        【解决方案4】:

        NotSerializableException

        只有transient字段在序列化过程中不会被省略。

        【讨论】:

        • @Michael Typo :) 在 Ninja Edit 中处理好了 :)
        【解决方案5】:

        然后没有

        你会得到这个:

           java.io.NotSerializableException: Foo
        

        【讨论】:

          【解决方案6】:

          如果你想让你的 Example 对象被序列化,我认为你需要处理自定义序列化。干得好: 1. 鉴于 Foo 来自您无法更改的 jar,请将其设为瞬态(否则您将在运行时遇到异常,如前所述)。 2. 定义“readObject”/“writeObject”并从那里管理您的序列化过程。 - 调用 defaultWriteObject 以使 Java 序列化它可以序列化的内容。 提取 foo 类的状态(在您的示例中, Foo 的内部状态是“a”) - 显式序列化“a” 在反序列化过程中也应该这样做: - 调用默认的反序列化机制 - 反序列化“a”(您知道在默认数据之后,流中有您的自定义字符串) - 从 readObject 中的 A 创建 Foo 实例。

          一般来说,我建议您阅读 Joshua Bloch 的“Effective Java”一书中的相关内容 - 他在那里对这个主题进行了很好的介绍。 另外网上有很多例子

          例如Serialization Example

          希望对你有帮助

          标记

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-18
            • 2016-04-21
            • 2014-05-30
            • 1970-01-01
            相关资源
            最近更新 更多