【问题标题】:java.io.NotSerializableException when class implements Serializable类实现 Serializable 时出现 java.io.NotSerializableException
【发布时间】:2015-11-23 00:11:53
【问题描述】:

即使我的 Hub 类实现了可序列化,我也会收到以下 notSerializableException。当我尝试使用 ObjectOutputStream 写入文件时会发生这种情况。我的项目包含太多类,无法合理地在此处发布,因此我最感兴趣的是,除了类没有实现 Serializable 之外,还有什么其他原因可能导致此错误。另一个令人费解的事情是我没有将 Hub 类的对象写入文件,我正在编写来自完全不同的类的对象的 ArrayList,该类也实现了可序列化。

java.io.NotSerializableException: bikescheme.Hub$1
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.ArrayList.writeObject(Unknown Source)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.ArrayList.writeObject(Unknown Source)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.ArrayList.writeObject(Unknown Source)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at bikescheme.Database.updateStations(Database.java:366)
at bikescheme.Database.addStation(Database.java:235)
at bikescheme.Hub.addDStation(Hub.java:148)
at bikescheme.HubTerminal.addDStation(HubTerminal.java:71)
at bikescheme.HubTerminal.receiveEvent(HubTerminal.java:52)
at bikescheme.EventDistributor.sendEvent(EventDistributor.java:75)
at bikescheme.EventDistributor.sendEvents(EventDistributor.java:98)
at bikescheme.SystemTest.runTestAndReturnResults(SystemTest.java:359)
at bikescheme.SystemTest.runAndCheck(SystemTest.java:341)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:33)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

【问题讨论】:

  • 您的 Hub 类是否碰巧有不可序列化的引用类型成员变量?
  • bikescheme.Hub$1 不可序列化。那应该是 Hub.java 中的第一个匿名内部类。
  • 是否可以发布bikescheme.Hub 的所有代码?我们或许可以向您显示匿名类的位置。

标签: java exception serialization


【解决方案1】:

看起来您有一个不可序列化的匿名内部类对象 (bikscheme.Hub$1):

java.io.NotSerializableException: bikescheme.Hub$1

【讨论】:

  • 匿名内部类到底是什么?我声明了一个单例类的实例,但它也实现了可序列化。
  • @mankee 如果您不知道内部类是什么,那么我认为您需要在处理序列化之前阅读更多 Java 基础知识。
  • 我知道什么是内部类,但我从来没有处理过匿名类
  • 好吧,我找到了匿名类,但是如何让它实现 Serializable,我已经在它的定义以及它拥有的所有私有内部类的定义中放入了实现 Serializable。
  • @mankee 我认为您需要向我们展示bikescheme.Hub 的所有代码。
【解决方案2】:

这应该可以回答所有问题:

public class BadSerializingClass implements Serializable {

    class ThisIsNotOK {} // comment out, it'll work

    class ThisIsOk implements Serializable {}

    // MVs
    ThisIsNotOK m1  = new ThisIsNotOK();    // comment out, it'll work
    ThisIsOk    m2  = new ThisIsOk();

    Runnable    innerAnonymousClass = new Runnable() { // comment out, it'll work
        @Override public void run() {
            System.out.println("Hello");
        }
    };

    public static void main(final String[] args) throws FileNotFoundException, IOException {
        final BadSerializingClass s = new BadSerializingClass();
        final ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test.dat"));
        oos.writeObject(s);
        System.out.println("All OK");
    }

}

【讨论】:

  • 问题是我的内部类是这样引用的`Clock.getInstance().scheduleNotification(。它实际上并没有在 Hub 类中定义......我已经在 Clock.java 文件中添加了Clock implements serializable,但它没有帮助
  • 如果您不能使其可序列化,您有两个选择:1) 为变量指定瞬态关键字 => Java 不会尝试对其进行反序列化 2) 使用自定义序列化:oracle.com/technetwork/articles/java/javaserial-1536170.html跨度>
  • 我添加了private transient Clock clock = Clock.getInstance(); 并删除了可序列化的工具。现在我得到了 bikeScheme.Clock 上不可序列化的异常
  • 这应该如何回答所有问题?请解释。仅有代码是不够的。
【解决方案3】:

transient 添加到项目内Clock 的所有实例中已经解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 2018-04-29
    • 2013-09-30
    相关资源
    最近更新 更多