相关疑难解决方法(0)

查找违反非Serializable成员变量的路径

在Java中,Serialization使得对象的读取和写入非常容易.例如,以下代码片段主要是将对象写入流所需的全部内容:

ObjectOutputStream oos = ... //Initialize your output stream
Object toWrite = ...         //Initialize what you want to write here
oos.writeObject(toWrite);    //Writes the object to the stream
oos.flush();
Run Code Online (Sandbox Code Playgroud)

只要toWrite该类实现了Serializable接口,并且所有toWritetransient成员变量也是如此,这将正常工作Serializable.换句话说,您尝试通过toWrite引用发送的整个对象层次结构必须是Serializable.假设这段代码的唯一问题是内部的东西toWrite不是Serializable.

如果层次结构不完整Serializable,则oos.writeObject(toWrite)抛出a 的调用java.io.NotSerializableException.这一切都很好,除了Exception不能为您提供快速解决问题所需的一切.它会告诉你哪个类无法序列化.您的堆栈跟踪可能如下所示:

java.io.NotSerializableException: some.package.and.ClassIDidntExplicitlyReference
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    ...
    at my.package.MyClass.codeThatWroteTheOffendingObject(MyClass.java:###)
Run Code Online (Sandbox Code Playgroud)

这种方式指向正确的方向,但在涉及深度对象层次结构的情况下,toWrite并不总是清楚违规类引用的来源.假设我分配toWrite给一个实例,MyClass并且我的实例MyClass有一个成员对象引用nonSerializableReference,该引用被设置为一个实例ClassIDidntExplicitlyReference,而不是Serializable.我希望看到以下内容打印出来:

my.package.MyClass.nonSerializableReference instanceof …
Run Code Online (Sandbox Code Playgroud)

java serialization

8
推荐指数
2
解决办法
2625
查看次数

标签 统计

java ×1

serialization ×1