1

クライアントがクラスのオブジェクトを持っていて、このクラスが新しい状態に変化したとします。そのクラスが以前の状態を呼び出した場合、何が起こるでしょうか?

例:

私は次のように1つのクラスを書きました

Class Old{
int a;
}

Class Old の新しいオブジェクトを作成したとします。このオブジェクトもシリアル化しました。次に、Old クラスを次のように変更します。

Class Old{
int a;
int b;
}

オブジェクトを new Old Class で非シリアル化しようとするとどうなりますか?

4

2 に答える 2

3

クライアントはオブジェクトへの参照を保持しているため、現在のオブジェクトとその現在の状態に常にアクセスします。クラスのインスタンスは、古くなったり無効になったりするという意味ではステートフルではありません。

クラスのインスタンスを 1 か所で変更すると、そのインスタンスを参照するすべてのクラスがアクセスできるようになります。

この例は、すべてのクラスがメモリ内の同じ場所を指すState,B,Cのインスタンスを含むため、上記のポイントを示しています。クラスが変更されると、変更の状態は、クラスが参照するメモリ内のインスタンスに対して行われます。Aaka: referenceBAState,B,C

C変更されたと考えないでください。Aこれで、 のすべてのインスタンスAが更新されます。誰もが更新されたオブジェクトを指しているようなものだと考えてください。

これは本当に単純な実際の例です。すべての友達に、私の LinkedIn プロフィールを編集する許可を与えたとしましょう。私の LinkedIn プロフィールを「A」と考えてください。友達全員が私のプロフィール (A) を見ると、私の役職は Web アプリケーション開発者であることがわかります。ここで、友人 (B) の 1 人が私のプロフィールにアクセスし、タイトルを Hobo (フィールド) に変更すると、すべての友人 (A、B、C) に新しいタイトルが表示されます。私の他の友人 (州、C) が私の肩書き (フィールド) として「Web アプリケーション開発者」を見ないのはなぜですか? これは、私のプロファイル (A) のインスタンスが 1 つあり、同じプロファイルがアクセス権を持つすべてのユーザーによって表示または更新されるためです。

public class State {

    public static void main(String[] args) {
        A a = new A();
        B b = new B(a);
        C c = new C(a);

        System.out.println(a.field); //0
        System.out.println(b.a.field); //0
        System.out.println(c.a.field); //0

        b.change();

        System.out.println(a.field); //3
        System.out.println(b.a.field); //3
        System.out.println(c.a.field); //3

    }
}

class A{
    public Integer field = 0;
}

class B{
    public A a;

    public B(A a){
        this.a = a;
    }

    public void change(){
        this.a.field = 3;
    }
}

class C{
    public A a;

    public C(A a){
        this.a = a;
    }
}
于 2013-06-20T09:10:52.820 に答える
0

ケビンが述べたように、「クライアントはオブジェクトへの参照を保持しているため、常に現在のオブジェクトとその現在の状態にアクセスします。」

ただし、RMI とシリアライゼーションを使用している場合は、使用しているクラスとシリアライズされたバイトとの間にバージョンの不一致があると、デシリアライゼーションの問題が発生する可能性があります。Java は、デシリアライズするバイトがローカル クラスのバージョンと一致するかどうかを認識します。そうでない場合、例外がスローされます。SerialVersionId は、シリアル化に使用されるクラスの一意の識別子です。

于 2013-06-20T09:15:33.920 に答える