0

次のクラス構造が与えられた場合、Bar は期待どおりにシリアライズ/デシリアライズしますか?

public class Foo { int x; string y; }

[Serializable]
public class Bar {
   Foo[] AllFoos;
   Foo SelectedFoo;

   public Bar(Foo[] allFoos, int selectedFooIndex) { 
     this.AllFoos = allFoos; 
     this.SelectedFoo = allFoos[selectedFooIndex]; 
   } 
}

私はいくつかのことに興味があります:

1) BinaryFormatter は、Bar クラスを [Serializable] 属性で装飾するか、ISerializable インターフェイスを実装する必要がありますか?

2) Foo クラスも [Serializable] 属性で装飾する必要がありますか?

3) Bar が単に [Serializable] 属性で装飾されている場合、フィールド Bar.SelectedFoo は配列への参照を正しく維持しますか? それとも、その Foo のコピーを手に入れるのでしょうか?

4

1 に答える 1

2

1) BinaryFormatter は、Bar クラスを [Serializable] 属性で装飾するか、ISerializable インターフェイスを実装する必要がありますか?

はい、BinaryFormatter を使用して Bar インスタンスをシリアル化する場合はそうです。

2) Foo クラスも [Serializable] 属性で装飾する必要がありますか?

はい、Foo オブジェクトのインスタンスのシリアル化を伴わないカスタムのシリアル化メカニズムを作成しない限り。たとえば、x コンポーネントと y コンポーネントを別々にシリアル化し、逆シリアル化コードでそれらから新しい Foo インスタンスを作成できます。それ以外の場合は、属性またはインターフェイスが必要です。

3) Bar が単に [Serializable] 属性で装飾されている場合、フィールド Bar.SelectedFoo は配列への参照を正しく維持しますか? それとも、その Foo のコピーを手に入れるのでしょうか?

私の記憶が正しければ、配列はこのようにシリアル化できません。配列を読み書きするための独自のメカニズムを (ISerializable インターフェイスを介して) 提供する必要があります。

ただし、一般に、相互参照を持つシリアライズ可能なオブジェクトのグラフが BinaryFormatter でシリアライズされる場合、オブジェクトを複製することなく参照を正しく再作成します。これには、Foo を Serializable で装飾し、配列とフィールドの両方から同じオブジェクト インスタンスをフォーマッタに渡す限り、カスタム シリアライゼーション コードで指定するオブジェクトも含める必要があります。

于 2011-04-07T21:04:22.213 に答える