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를 직렬화 할 때 DummyClass를 소유 한 DummyClassTest 인스턴스에 대한 암시 적 참조를 직렬화합니다.

DummyClass를 최상위 클래스 (중첩되지 않은 클래스) 또는 정적 내부 클래스로 정의하면 모든 것이 예상대로 작동합니다.

다음 :

public class DummyClassTest { 
    public class DummyClass { 
    } 
} 

이 더 많거나 적은 동등한

public class DummyClassTest { 
} 

public class DummyClass { 
    private DummyClassTest outerInstance; 
} 
+0

그건 내가 쓴 것 중 가장 어리석은 짓이야. 감사합니다. 나는 그것을 시험하는 것을 잊어 버렸습니다. :) –