2017-02-13 63 views
0

我有一個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的類,那麼問題出在這個接口上嗎?

+0

您可以添加一個手動序列化程序到MyProject.MyForm,將其標記爲Serializable,在手動序列化程序中放置一個斷點,然後您可以看到是什麼觸發嘗試序列化該對象? (「使用ISerializable的自定義序列化」 - http://kb4dev.com/tutorial/.net-framework-classes-using-csharp/binary-serializer-例如。) –

+0

啊,所以可能MyForm訂閱了屬性更改事件正如漢斯所說,現在也出現在事件訂戶的內部列表中,這些列表也被序列化。 – Evk

+0

該事件的@HansPassant [NonSerialized]顯示一個編譯器錯誤,它只對字段聲明有效。另外,我需要實現僅在此類上更改的屬性。通常我的DTO是真正的POCO。 –

回答

0

BinaryFormatter也會序列化事件的後臺字段。可能看起來很奇怪,但有時這確實有效。但是,如果一個Form對象訂閱了該事件,那麼它就不是一個可序列化的類。修復:

[field:NonSerialized] 
    public event PropertyChangedEventHandler PropertyChanged; 

哪些確實力,你認爲如何事件需要訂閱,當你反序列化對象。沒有通用的指導,除了將序列化的數據保存在POD類中而沒有任何花裏胡哨的總是一個好主意。使他們更容易推理,並且更容易維護而不會造成嚴重的版本頭痛。

+0

此修復程序正在工作。在我的情況下,我從來沒有反序列化。我只是序列化對象只是爲了比較當前對象與原始對象。 –

+0

你一定會後悔這一點。例如,您不能使用「decimal」作爲成員。 –

相關問題