2017-02-13 5 views
0

のフォームをシリアル化しようとします。このクラスのみがINotifyPropertyChangedです。にBinaryFormatterは、私は次のようになりますDTOクラスを持っている代わりに、オブジェクト

public static bool IsEqual<T>(this T object1, T object2) 
{ 
    byte[] array1 = object1.ToByteArray(); 
    byte[] array2 = object2.ToByteArray(); 

    return array1.SequenceEqual(array2); 
} 

上記の方法は問題なく全アプリ全体で使用されている:

Iはまた、(複雑なオブジェクト・グラフとすることができる)2つのオブジェクトを比較する一般的な延長部を有します。しかし、この1つの特定のクラスに、私は次の例外を取得しています:

タイプ「MyProject.MyForm集会で「MyProjectと、バージョン= 1.0.0.0、カルチャニュートラル、PublicKeyToken = = null」がマークされていません直列化可能として

私のコードをチェックして再確認しました。フォームにエクステンションを渡している場所がありません。

フォームをシリアル化したくありません。私はオブジェクトを直列化したい(これは、他のすべてのフォームと同様に、フォーム自体のローカル変数です)。また、上記の拡張機能をデバッグすると、両方のパラメータが同じで、予想される型であることがわかります。

これはINotifyPropertyChangedを実装する唯一のクラスであるため、このインターフェイスに問題はありますか?

+0

MyProject.MyFormに手動シリアライザを追加し、シリアライズ可能とマークし、手動シリアライザにブレークポイントを設定して、そのオブジェクトをシリアル化しようとするトリガを確認できますか? (「ISerializableを使用したカスタムシリアル化」 - http://kb4dev.com/tutorial/.net-framework-classes-using-csharp/binary-serializer - 例) –

+0

ああ、おそらくMyFormはプロパティ変更イベントに登録されていますHans氏のように、シリアライズされたイベント加入者の内部リストにも存在します。 – Evk

+0

@HansPassantイベントの[NonSerialized]は、フィールド宣言でのみ有効であるというコンパイラエラーを示します。また、私はこのクラスでのみ変更されたプロパティを実装する必要があります。通常私のDTOは本当にPOCOです。 –

答えて

0

BinaryFormatterは、イベントのバッキングフィールドもシリアル化します。奇妙に思えるかもしれませんが、これは時には実際には機能します。しかし、Formオブジェクトがイベントをサブスクライブしている場合は、シリアル化可能クラスではありません。修正:

[field:NonSerialized] 
    public event PropertyChangedEventHandler PropertyChanged; 

どのないあなたがオブジェクトをデシリアライズするとき、そのイベントをサブスクライブする必要がどのように考える力。ユニバーサルガイダンスはありません。シリアルを使わずにシリアライズ可能なデータをPODクラスに保存することは、常に良いアイデアです。彼らに徹底的な理由付けが容易になり、徹底したバージョンの頭痛がなければ、維持するのがずっと簡単になります。

+0

この修正は機能しています。私の場合、私は決して逆直列化しません。私はちょうど現在のオブジェクトと元のオブジェクトを比較するためにオブジェクトをシリアル化します。 –

+0

あなたは後でこのことを後悔するつもりです。たとえば、メンバーとして 'decimal'を使うことはできません。 –

関連する問題