2014-11-16 3 views
2

직렬화 중에 정적 변수의 값을 유지하는 방법 (전혀 유지되는 경우) 나는 정적 변수가 본질적으로 일시적이라고 말하면서 스택에 비슷한 질문을 읽었다. 즉, 상태 또는 현재 값이 직렬화되지 않는다.java 정적 변수 직렬화

저는 클래스를 직렬화하고 파일에 저장 한 다음 파일에서 클래스를 다시 생성하는 간단한 예제를 수행했습니다. 놀랍게도 직렬화가 발생했을 때 정적 변수의 값이 저장되었습니다.

어떻게 될까요? 이는 클래스 템플릿이 인스턴스 정보와 함께 직렬화 중에 저장되기 때문입니다. 여기에 코드입니다 - 여기

public class ChildClass implements Serializable, Cloneable{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 5041762167843978459L; 

    private static int staticState; 
    int state = 0; 

    public ChildClass(int state){ 
     this.state = state; 
     staticState = 10001; 
    } 

    public String toString() { 
     return "state" + state + " " + "static state " + staticState; 
    } 

    public static void setStaticState(int state) { 
     staticState = state; 
    } 

및 것은

public class TestRunner { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     new TestRunner().run(); 
    } 

    public TestRunner() { 

    } 

    public void run() { 
     ChildClass c = new ChildClass(101); 
     ChildClass.setStaticState(999999); 
     FileOutputStream fo = null; 
     ObjectOutputStream os = null; 

     File file = new File("F:\\test"); 
     try { 
      fo = new FileOutputStream(file); 
      os = new ObjectOutputStream(fo); 
      os.writeObject(c); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } finally { 

      try { 
       if(null != os)os.close(); 
       if(null != fo) fo.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 


     FileInputStream fi = null; 
     ObjectInputStream ois = null; 
     ChildClass streamed; 

     try { 
      fi = new FileInputStream(file); 
      ois = new ObjectInputStream(fi); 
      Object o = ois.readObject(); 
      if(o instanceof ChildClass){ 
       streamed = (ChildClass)o; 
       //ChildClass cloned = streamed.clone(); 
       System.out.println(streamed.toString()); 
      } 
     } catch (IOException | ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } finally { 
      try { 
       if(null != ois)ois.close(); 
       if(null != fi) fi.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 
    } 

주 내 주요 클래스 : 코드 아무 문제가 없습니다. 방금 'ChildClass'클래스의 정적 변수 'staticState'의 값이 저장되는 방법에 대해 궁금합니다. 네트워크를 통해이 직렬화 된 데이터를 전송하면 상태가 저장됩니까

+1

가능한 중복이 아닌 것을 알하려면 (http://stackoverflow.com/questions/3147811/serialize-static-attributes-in-java). 이 질문이 적절한 복제본인지 아닌지는 아직 확실하지 않기 때문에 질문을 "속이 망치질"하지 않았습니다. –

+0

비록 내 질문에 정적 변수의 직렬화에 관련되어 있지만 내 질문에 실제로는 표준 문서 당 않습니다 것으로 나타납니다 행동에 있습니다. – Dibzmania

답변

2

정적 필드 값이 직렬화되지 않았습니다. 출력은 999999로 수정되었지만 de-serizalizing 전에 이전 값으로 재설정하지 않았기 때문에 정적 필드의 새 값을 인쇄하는 것입니다. 필드가 고정되어 있으므로 인스턴스에 새 값이 반영됩니다 (ChildClass).

제대로, 필드가 직렬화 아니라고 주장 드 직렬화 객체 전에 만일에 값을 다시 설정, 당신은 그 값이 [이 질문]의 999999

... 
ChildClass.setStaticState(10001); 

FileInputStream fi = null; 
ObjectInputStream ois = null; 
ChildClass streamed; 

... 
// when de-serializing, the below will print "state101 static state 10001" 
System.out.println(streamed.toString()); 
+0

그건 내 질문이다. 정적 변수 값의 변경은 같은 프로그램 내에서 직렬화 및 비 직렬화, 즉 클래스가 이미 VM 내에로드되어 있기 때문에 반영됩니다. 직렬화 된 데이터가 네트워크를 통해 전송되는 경우 생성자에서 설정된 값으로 재설정됩니까 ?? – Dibzmania

+0

@Dibzmania 예. 이전 버전으로 재설정됩니다. 실제로 클래스에 이미 VM에로드되어 있기 때문에 여기에 새로운 값이 있습니다. – manouti

+0

귀하의 확인과 함께 갈 것입니다 :-) – Dibzmania