2

C# でのバイナリ シリアル化について質問があります

クラス B のオブジェクトを (もちろんグラフ内のすべてのサブオブジェクトと共に) ディープ クローンできるようにする必要があります。バイナリシリアル化を使用してこれを実装したいと思います。それが最善の方法であるかどうかの議論は、この質問の文脈では無関係です。

私はこのクラス構造を持っているとしましょう:

public class A 
{
    private B objB;
}

[Serializable]
public class B : ICloneable
{
    private C objC1;
    private C objC2;

    public object Clone()
    {
        B clone = Helper.Clone<B>(this);
        return (B)clone;
    }
}

[Serializable]
public class C
{
    int a;
    int b;
}

バイナリ シリアライゼーションを使用したディープ クローン作成用のヘルパー クラス (このメソッド コードはネット上のどこかから取得しました。TBH がどこにあるかはよく覚えていませんが、問題ないようです)

public static class Helper
{
    public static T Clone<T>(T OriginalObject)
    {
        using (Stream objectStream = new MemoryStream())
        {
            IFormatter formatter = new BinaryFormatter();
            formatter.Serialize(objectStream, OriginalObject);
            objectStream.Seek(0, SeekOrigin.Begin);
            return (T)formatter.Deserialize(objectStream);
        }
    }

}

したがって、アプリのある時点で、次のコードをヒットしました。

B clone = (B)objA.objB.Clone();

問題は、デバッガーが、クラス A がシリアライズ可能としてマークされていないことを嘆いていることです。

しかし、私はAをシリアライズしたくありません.Bをシリアライズしたいのですが、それはサブオブジェクトCです.

オブジェクトグラフですべて相互接続されているため、親オブジェクト A もシリアル化しようとしていると思います。しかし、この時点でシリアル化から除外する方法はありますか?

4

5 に答える 5

2

この簡単なモック コードは完全に正常に動作します。問題は別の場所にあり、おそらくCclass の変数がありAますか?

public class A
{
    private B bObj = new B();

    public A()
    {
        B copy = bObj.Clone() as B;
    }
}
[Serializable]
public class B : ICloneable
{
    private int test = 10;

    public object Clone()
    {
        return Helper.Clone(this);
    }

}

コメントごとに編集:

eventに以下を追加してくださいB

[field:NonSerialized]

これにより、参照するイベントの呼び出しリストのシリアル化が防止されます。A

于 2010-01-12T21:32:04.150 に答える
1

B が A への参照を保持していない場合、B をシリアル化する場合、A が B への参照を保持していても、A をシリアル化可能にする必要はありません。

コード サンプルから、B は A への参照を保持していないため、機能するはずです。提供したコード サンプルが実際のシナリオを本当に表していると確信していますか?

于 2010-01-12T21:31:20.253 に答える
0

ここで何か他のものが機能している必要があります-コードは問題なくコンパイルおよび実行されます(当然のことながら-型は型オブジェクトグラフAの一部ではありません)。B's

objBそれが実際にタイプのインスタンスである可能性はありますAか?

于 2010-01-12T21:35:12.577 に答える
0

よくわかりませんが、シリアル化不可としてマークするとどうなりますか? 私はそれをテストします:P

于 2010-01-12T21:31:38.773 に答える
0

すべての返信に感謝します。問題を見つけました...

クラス B にはパブリック イベント フィールドが含まれており、クラス A のイベント ハンドラがそれにサブスクライブされています。イベントハンドラーのサブスクライブを解除すると、シリアル化が機能します。

コード全体の状況を投稿しなかった私の間違い、申し訳ありません:(

于 2010-01-12T22:23:06.357 に答える