3

状況はこのようなものです: メイン プロジェクト A. とクラス ライブラリ B. A は B を参照します

プロジェクト B には、シリアル化されるクラスがあります。クラスは A で使用されます。ここで、Project AI から B のオブジェクトをシリアル化しようとすると、問題が発生します。A のクラスをシリアル化できないという例外がスローされます。BI のクラスでは A のクラスを参照できないため、これは奇妙な部分です (循環依存関係が作成されます)。

問題を追跡するにはどうすればよいですか? 例外メソッドは問題が発生した場所を示していないためですか?

編集:わかりました、 Kent Boogaartの小さなアプリの 助けを借りて問題を見つけました:D。プロジェクト A のクラスに、Serializable とマークされていない PropertyChanged リスナーがあり、そのようにマークしたくありません。(そのクラスを右にシリアライズしますか?)

このリンクをたどってイベントの問題を解決しました: .NET 2.0 solution to serialization of objects that raise events . まだ問題がありますが、おそらく似たようなものです。

PS: Kent Boogaart の優れたツール

4

4 に答える 4

10

オブジェクト グラフでシリアライズできないものと、それがどのように参照されているかを教えてくれるsertoolというツールを作成しました。

于 2008-10-08T10:44:52.877 に答える
2

まず、問題を特定のクラスに分離する必要があります。次に、カスタムのシリアル化を実装してデバッグし、実際の問題を見つけることができます。

プロセスをステップ実行できるようにするための単純な実装:

using System;
using System.Runtime.Serialization;
using System.Security.Permissions;

[Serializable]
public class Test : ISerializable
{
    private Test(SerializationInfo info, StreamingContext context)
    {
        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(Test));

        foreach (SerializationEntry entry in info)
        {
            PropertyDescriptor property = properties.Find(entry.Name, false);
            property.SetValue(this, entry.Value);
        }
    }

    [SecurityPermission(SecurityAction.LinkDemand, SerializationFormatter = true)]
    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    {
        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(Test));

        foreach (PropertyDescriptor property in properties)
        {
            info.AddValue(property.Name, property.GetValue(this));
        }
    }
}

Kent のツールも非常に見栄えがよく、間違いなく役に立ちます。

于 2008-10-08T10:51:04.237 に答える
1

おそらく、B からのオブジェクトは、A または B の一部ではないクラス/インターフェイスを使用して、A からのオブジェクトへの参照を格納しています。たとえば、B がオブジェクト (System.Object) 参照を使用して A からのオブジェクトを格納している場合

于 2008-10-08T10:43:29.337 に答える
0

TAとTBがAとBで定義されたタイプであるとしましょう。BにインターフェイスIがあるか、BとAの両方のアセンブリが参照されているとしましょう。TAはIを実装します。TBには、Pという名前のタイプIのパブリックで設定可能なプロパティがあります。

これで、次のことができます。

TB b = new TB();
b.P = new TA();

TAはIを実装しているので、これは可能です。

これで、オブジェクトグラフには、シリアル化できない可能性のあるタイプのインスタンスがあり、アセンブリAから取得されます。

于 2008-10-08T11:19:40.387 に答える