2

这是即将被序列化为字节数组的类。ObjectOutput引发java.io.NotSerializableException

public class DummyClass implements Serializable 
{ 
    private static transient final long serialVersionUID = -8483859843874771619L; 
    public String y; 

    public DummyClass(String y) 
    { 
     this.y = y; 
    } 
    public String getY() 
    { 
     return this.y; 
    } 
} 

这是序列化执行测试

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    ObjectOutput out = null; 
    byte[] bs = null; 
    try 
    { 
     DummyClass dummyClass = new DummyClass("World I Salute you"); 
     out = new ObjectOutputStream(bos); 
     out.writeObject(dummyClass); // <--- Throws exception here 
     bs = bos.toByteArray(); 
    } 
    finally 
    { 
     out.close(); 
     bos.close(); 
    } 

和有关堆栈跟踪:

java.io.NotSerializableException: tests.DummyClassTest 
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 tests.DummyClassTest.dummyTest(DummyClassTest.java:109) 

明显的问题是什么我做错了什么?

干杯。

EDIT

整个类

public class DummyClassTest 
{ 
    public class DummyClass implements Serializable 
    { 
     private static transient final long serialVersionUID = -8483859843874771619L; 
     public String y; 

     public DummyClass(String y) 
     { 
      this.y = y; 
     } 
     public String getY() 
     { 
      return this.y; 
     } 
    } 

    @Test 
    public void dummyTest() throws IOException 
    { 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     ObjectOutput out = null; 
     byte[] bs = null; 
     try 
     { 
      DummyClass dummyClass = new DummyClass("World I Salute you"); 
      out = new ObjectOutputStream(bos); 
      out.writeObject(dummyClass); 
      bs = bos.toByteArray(); 
     } 
     finally 
     { 
      out.close(); 
      bos.close(); 
     } 
    } 
} 
+3

我不认为这或多或少相当于是所有相关的代码。 DummyClassTest在哪里定义? – Perception

+0

你的意思是'DummyClassTest'所有这些代码都在这个类中。是一个JUnit测试。 –

+0

DummyClassTest的粘贴代码 –

回答

8

非静态内部类具有到其外类实例的隐式引用。因此,当您序列化DummyClass时,您还将此隐式引用序列化为拥有它的DummyClassTest实例。

将DummyClass定义为顶级类(非嵌套)或静态内部类,并且所有内容都按预期工作。

以下:

public class DummyClassTest { 
    public class DummyClass { 
    } 
} 

public class DummyClassTest { 
} 

public class DummyClass { 
    private DummyClassTest outerInstance; 
} 
+0

这是我写过的最愚蠢的东西。谢谢,我忘了测试。 :) –

相关问题