我有一個DTO類看起來是這樣的:BinaryFormatter的嘗試序列形式,而不是一個對象
[Serializable]
[DataContract()]
public class MyClass : IEntity, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[DataMember()]
public int Id { get; set; }
[DataMember()]
public string Name { get; set; }
}
我所有的DTO類和它們的屬性具有相同的屬性。只有這個班級有INotifyPropertyChanged
。
我也有一個通用的擴展,其比較兩個對象(可能是複雜的對象圖):
public static bool IsEqual<T>(this T object1, T object2)
{
byte[] array1 = object1.ToByteArray();
byte[] array2 = object2.ToByteArray();
return array1.SequenceEqual(array2);
}
被在整個應用程序中所使用的上述方法沒有任何問題。然而,在這一個特定的類,我發現了以下異常:
類型「MyProject.MyForm」在大會「MyProject的,版本= 1.0.0.0,文化=中立,公鑰=空」未標記作爲可序列化。
我檢查並重新檢查了我的代碼,並且沒有地方將表單傳遞給擴展。
我不想序列化表單。我想序列化一個對象(這是本身的一個局部變量,就像我所有的其他形式一樣)。此外,調試上述擴展名顯示兩個參數都是相同的和預期的類型。
由於這是唯一實現INotifyPropertyChanged
的類,那麼問題出在這個接口上嗎?
您可以添加一個手動序列化程序到MyProject.MyForm,將其標記爲Serializable,在手動序列化程序中放置一個斷點,然後您可以看到是什麼觸發嘗試序列化該對象? (「使用ISerializable的自定義序列化」 - http://kb4dev.com/tutorial/.net-framework-classes-using-csharp/binary-serializer-例如。) –
啊,所以可能MyForm訂閱了屬性更改事件正如漢斯所說,現在也出現在事件訂戶的內部列表中,這些列表也被序列化。 – Evk
該事件的@HansPassant [NonSerialized]顯示一個編譯器錯誤,它只對字段聲明有效。另外,我需要實現僅在此類上更改的屬性。通常我的DTO是真正的POCO。 –