2011-02-14 20 views
5

我有一個不會正確序列化的公共類。嘗試時,會拋出以下異常:類型不可序列化,因爲它不公開?

數據協定類型'MyProject.MyClass'由於未公開,因此不可序列化。公開這個類型將修復這個錯誤。或者,您可以將其設置爲內部,並在程序集中使用InternalsVisibleToAttribute屬性,以啓用內部成員的序列化 - 請參閱文檔以獲取更多詳細信息。請注意,這樣做有一定的安全隱患。

類是公衆,雖然:

[DataContract] 
public class MyClass 
{ 
    [DataMember] 
    public string Name { get; set; } 

    [DataMember] 
    private int Count; 

    public MyClass() 
    { 
     Name = string.Empty; 
     Count = 0; 
    } 
} 

爲什麼會出現這種異常,當類顯然是公開的嗎?

回答

8

在Windows Phone 7個的應用程序,你不能序列化私有成員:

那麼,它只是恰巧,WP7應用將在一個「部分信任」環境和「完全信任」 -land之外運行,DataContractSerializer拒絕序列化或反序列化非公共成員。當然,這個異常被.NET內部吞噬了,所以我所見過的關於我所知道的事情的奇怪信息是公開的「不公開」。我改變了所有我正在序列化爲公共的私有領域,並且一切正常。 http://geekswithblogs.net/mikebmcl/archive/2010/12/29/datacontractserializer-type-is-not-serializable-because-it-is-not-public.aspx

更改代碼以避免序列化私有成員修復該問題。

2

您可以通過編寫此類的自定義序列化來解決此問題。內置的XML序列化只能序列化公共屬性。

您可以執行下列操作之一來解決此限制:

  • 得到Count
  • 擺脫DataMember屬性讓Count公共
  • 實現你所需要IXmlSerializable(或任何其他系列化),並手動序列化這些私有成員
相關問題