2

オブジェクトのリストをソケット経由で送信しようとしています。

リスト内のオブジェクトにはシリアル化できないオブジェクトが含まれているため送信できませんが、基本クラスは完全にシリアル化可能であり、必要なすべてのフィールドが含まれています。

だから私がしようとしているのは、リストを基本クラスのリストに変換することです。私が考えることができる唯一の方法は、次のとおりです。

// subClassList is an ArrayList<SubClass>
ArrayList<BaseClass> baseClassList = new ArrayList<BaseClass>();
for(SubClass subClass: subClassList) {
    // cast to the base class
    baseClassList.add((BaseClass)subClass);
}

ただし、同じ NotSerializableException 例外が発生するため、これは機能しません。コードをデバッグすると、キャストされているにもかかわらず、新しいリストがまだサブクラスのリストであることがわかります。

私がやろうとしていることを達成する方法はありますか?

4

4 に答える 4

1

参照をキャストしても、実際のオブジェクトの型は変更されません。

String foo = "hello";
Object bar = (Object) foo;
System.out.println(bar); // Hello
System.out.println(bar.getClass()); // java.lang.String

基本クラスのインスタンスのみが必要な場合は、基本クラスにコンストラクターを作成して、そのインスタンスを指定して基本クラスの新しいインスタンスを作成するだけで、いかなる種類のディープ コピーも実行しようとしません

public BaseClass(BaseClass other) {
    this.x = other.x;
    this.y = other.y;
    this.z = other.z;
    // etc
}

次に、あなたが示したコードで:

baseClass.add(new BaseClass(subClass));
于 2013-03-17T14:14:45.450 に答える
0

あなたの質問は、用語の矛盾を具体化しています。基本クラスがSerializableの場合、そのすべての派生クラスもSerializableです。派生クラスにシリアル化できないオブジェクトへの参照が含まれている場合は、それらを一時的にします。

于 2013-03-18T00:12:49.990 に答える
0

スーパークラス変数を使用してサブクラスオブジェクトを参照できますが、オブジェクト自体はサブクラスタイプであるため、このアプローチは機能しません。

最善の方法は、サブクラスをシリアル化するか、サブクラスからデータを抽出して新しく作成されたスーパー クラスに書き込むことです。サブクラスへの変換ビルドを行うための静的ユーティリティメソッドを用意するだけです....

于 2013-03-17T14:16:44.403 に答える
0

キャストはオブジェクトの型を変更しません。オブジェクトに別のタイプがある場合、オブジェクトの別のタイプの参照を取得できます。アップキャストは決して必要ありません。使用できます

String s = "hello";
Object o = s; // no cast needed

ダウンキャストが必要であり、オブジェクトにキャスト先の型がある場合にのみ機能します。

Object o = "hello";
Object o2 = Integer.valueOf(5);
String s = (String) o; // OK because o is a String
String s2 = (String) o2; // ClassCastException, because o2 is not a String.

したがって、コードは次と同等です

ArrayList<BaseClass> baseClassList = new ArrayList<BaseClass>();
for(SubClass subClass: subClassList) {
    // cast to the base class
    baseClassList.add(subClass);
}

コピー コンストラクターを使用して、新しい型の新しいオブジェクトを作成する必要があります。

ArrayList<BaseClass> baseClassList = new ArrayList<BaseClass>();
for(SubClass subClass: subClassList) {
    // cast to the base class
    baseClassList.add(new BaseClass(subClass));
}
于 2013-03-17T14:17:03.733 に答える