2011-02-24 4 views
0

개체를 직렬화 할 때 정적 필드의 "스냅 샷"도 가져 가고 싶습니다. 다음 코드가 좋은 방법입니까? readResolve()로 정적 필드 직렬화

public class ClassA implements Serializable { 

    private int num1; 
    private static int num2 = 5; 

    private int num2Saver; 

    public int getNum1() { 
     return num1; 
    } 

    public void setNum1(int num1) { 
     this.num1 = num1; 
    } 

    public static int getNum2() { 
     return num2; 
    } 

    public void setNum2(int num2) { 
     ClassA.num2 = num2; 
     num2Saver = num2; 
    } 

    private Object readResolve(){ 
     num2 = num2Saver; 
     return this; 
    } 
} 

+1

static 필드는 객체 상태의 일부가 아닙니다. –

+0

알아요.하지만 여전히 정적 필드의 값을 직렬화 시점에 저장하려고합니다. –

+0

왜 그 값을 직렬화 하시겠습니까? 직렬화 된 객체를 deserialize 할 때 정적 값으로 무엇을하고 싶습니까? 직렬화 된 마지막 값은 모든 클래스 인스턴스가 공유하는 값이 될 것입니다 ... – reef

답변

1

객체를 작성할 때 전용 private void writeObject(ObjectOutputStream out) throws IOException; 메서드를 구현하여 직렬화를 사용자 정의 할 수 있습니다. 그런 다음 객체를 비 직렬화해야 할 때 private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;이 있습니다.

이렇게하면 직렬화/직렬화 해제 과정을 사용자 정의 할 수 있습니다.

http://java.sun.com/developer/technicalArticles/Programming/serialization/을 참조하십시오.

+0

감사! 이 과정을 제어 할 수 있다는 것을 몰랐습니다. –

0

정적 멤버 변수는 클래스의 특정 인스턴스에 속하지 않는 (당신이 인스턴스를 통해 갈 필요가 정적 필드를 설정하기 위해 그 통지). - ClassA.num2 = num2;라고 말하면 특정 인스턴스에 대해 정적 변수 num2에 액세스하지 않는 것입니다. 클래스 이름을 사용하여 액세스하고 있는데, 이는 정적 변수가 액세스해야하는 이유입니다 (인수와 정적 변수가 모두 같은 이름을 갖기 때문에).

클래스 이름으로 액세스 할 때 정적 변수라는 것을 독자에게 분명히합니다. 합격 인수가 다른 이름을 가진다면, num2 = numX;이 맞을 것입니다. 그러나 이것은 독자에게 num2이 정적 변수인지 일반 클래스 변수인지에 대해 말하지 않습니다.

0

좋은 사례라고 생각하지 않습니다. 정적 멤버는 특정 인스턴스가 아닌 클래스에 전역으로 속함을 기억하십시오.

고정 멤버의 값이 다른 두 개의 ClassA 인스턴스를 직렬화하는 경우를 생각해보십시오. 직렬화 된 양식은 실제로 정적 데이터의 두 가지 버전을 나타냅니다. 그러나 두 인스턴스를 deserialize 한 후에는 정적 멤버의 값 하나만 보유하게됩니다 (마지막으로 deserialize됩니다).

즉, 정적 멤버의 값을 비 직렬화 순서에 종속되게 만듭니다.

0

정적 값은 직렬화되지 않아야합니다. 정말로 정적 값을 직렬화해야하는 경우 디자인을 다시 생각해 볼 수 있습니다.

수행 한 방식으로 직렬화하더라도 많은 문제가 발생할 수 있습니다. 값은 직렬화 된 객체마다 다를 수 있습니다.

역 직렬화시 사용할 값은 무엇입니까? 어느 것이 올바른 것인지를 결정할 수는 없습니다.