2013-06-17 3 views
0

나는 특별한 직렬화 (심지어 과도 객체 직렬화)을 구현하면서 흐름을 알아 내기 위해 노력 해왔다를 사용하지만 흐름을 이해할 수 없다 :자바 실행 논리 동안 사용자 정의 직렬화

public class object1 implements Serializable { 

int i = 2032423; 
String str = "dssadsadsdfsfsdfczxc"; 
StringBuilder sb = new StringBuilder(); 
transient testobject ob1 = new testobject(); 
String str2; 
testobject ob2; 
String sooo =new String("jbdskdbshxcbc"); 

public static void main(String[] args) throws ClassNotFoundException { 


    try { 

     FileOutputStream fos = new FileOutputStream(new File(
       "serialTst.txt")); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 
     object1 obj1 = new object1(); 
     obj1.ob1.str = "this guy is referred"; 
     oos.writeObject(obj1); 
     oos.flush(); 
     oos.close(); 
     fos.close(); 

     FileInputStream fis = new FileInputStream("serialTst.txt"); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     object1 obb=(object1)ois.readObject(); 
     System.out.println(obb.str2); 

     ois.close(); 
     fis.close(); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

private void readObject(ObjectInputStream Aois) 
     throws ClassNotFoundException, IOException { 
    Aois.defaultReadObject(); 
    str2 = (String) Aois.readObject(); 

    System.out.println(ob1.str); 
    System.out.println(sooo); // Why Null here?? 
} 

private void writeObject(ObjectOutputStream Aoos) throws IOException { 

    Aoos.defaultWriteObject(); 
    Aoos.writeObject(ob1.str); 
} 

}

를 ** 왜 정상적인 (문자열 sooo = "something")이 인쇄 될지라도 String sooo가 null 인 경우 ???? **

object1 클래스의 인스턴스가 생성되지 않으면 어떻게 readObject 및 writeObject가 실행됩니까 ??

+0

@luigi 관심을 가져 주셔서 감사합니다,하지만 귀하의 솔루션은 확실히 작동하지만, 왜 내가 제안한 내가 일하는 법을 알고 싶습니다 ??? –

+0

당신은 당신의 질문이 아니라 내 대답에이 코멘트를 게시 했어야합니다. 또한, 내 이름은 이중 G :)입니다. –

답변

1

ob1transient으로 표시되어 있으므로 직렬화되지 않았습니다. 또한 객체를 비 직렬화 할 때 Java는 클래스의 생성자도 생성자도 기본 값을 설정하지 않고 필드에 Java 기본값 (예 : int, Object, null)을 채 웁니다. ob1 필드 값은 null이됩니다.

수정readObject 방법의 코드 에, 당신은 그것을 사용하기 전에 ob1 필드를 초기화해야합니다

private void readObject(ObjectInputStream Aois) 
    throws ClassNotFoundException, IOException { 
    Aois.defaultReadObject(); 
    str2 = (String) Aois.readObject(); //this is totally ok 
    ob1 = new testobject(); 
    ob1.str = (String) Aois.readObject(); //this should work 
    System.out.println(ob1.str); 
} 
+0

죄송합니다. 미안해! –

+0

@SachinVerma 아마도 이걸 잘 설명하지 못했습니다. 간단히 말해서, 객체를 비 직렬화 할 때,'transient' 객체 참조 필드는'null' 값을 가질 것입니다 (비 직렬화 할 때의 기본 동작입니다). 따라서'readObject' 메쏘드에서'ob1'을 사용할 때'null'이 될 것이기 때문에 그것을 사용하기 전에 만들어야합니다. –

+0

안녕하세요. 그렇지만 String sooo도 null입니까 ?? –

0

을 내가 OB1 이되지 않은 이유 NullPointerException이,이 이유를 물어보고 싶은 그래서 뭐 초기화 되었습니까?

드 - 직렬화 constructor도 주어진 Serializable 구현 클래스의 instance initializer 호출하지 둘. 즉, transient으로 선언되어 직렬화되지 않은 클래스의 멤버 변수는 객체가 비 직렬화를 통해 바이트 스트림에서 생성 될 때 default value으로 초기화됩니다. 귀하의 경우

transient testobject ob1 = new testobject(); 

deserialization 동안 실행되지 않습니다. 그러나 객체가 생성되고 있으므로 JLS12.5으로 이동해야합니다. 필드는 기본값으로 초기화되어야합니다. 직렬화를 해제하는 동안 직렬화 가능 클래스 object1의 모든 필드 (은 일시적 및 정적으로 표시되지 않음) object1이 스트림에서 복원되고 으로 transient 변수 (ob1)가 초기화됩니다.

System.out.println(ob1.str); 

당신의 readResolve 메소드 내 NullPointerException 때문에 ob1.str의 던지고있다 : 다음 줄은 이유입니다.

그래서 그 방법 (readObject에,의 writeObject는)

readObjectwriteObject 방법을 작성하고 각각 개체를 읽을 JVM에 의해 자동으로 호출되어 자신의 실행을 시작하는 방법.

정상적인 경우 (문자열 sooo = "something")에도 문자열 sooo가 null 인 이유는 무엇입니까? 이 인쇄됩니다 ????

아니, Stringsooo가 될 때까지 null 일 수 없습니다 당신은 직렬화하기 전에 그것을 null하지 않는 한.

+0

아니요 String soo = new STring ("whatevr")이 인쇄되지 않습니다. –

+0

@SachinVerma : ** 아니 **'soo'는 * 아닙니다 null *입니다. 당신이 얻는'NullPointerException'은'ob1.str' 때문에 생긴 것이라고 생각합니다. 그리고 당신은'soo'를 위해 그것을 오해하고 있습니다. 또는 아마도이 프로그램이 현재 실행중인 프로그램이 아닙니다. –