2011-11-28 35 views
3

我正確地認爲,爲了讓C#能夠序列化一個對象,我必須爲需要其狀態存儲的每個字段提供一個公共屬性?C#XML序列化 - 弱化封裝?

如果是這樣,是不是非常非常爛,因爲它削弱(如果不完全中斷)我的類的任何封裝?

在Java中,XStream可以迭代每個非瞬態字段並對其進行存檔。在C#中,這不會發生,只是爲了讓事情變得更糟,像Dictionaries這樣的東西不會序列化AT ALL。這一切都是一團糟,不是嗎?

我已經看到XStream的「端口」爲.net的DLL,但沒有文檔,我很懷疑。

+0

如果我記得很清楚,我想吸必須是公開的,而不是二傳手。 – Exort

回答

3

您應該使用DataContractSerializer,並標記每個要與[DataMember]序列化的屬性/字段。它不關心你的領域是私人的還是公共的。順便說一句,你可以序列化詞典吧......

[DataContract] 
public class MyClass 
{ 
    [DataMember] 
    private string _privateField; 

    [DataMember] 
    public int PublicProperty { get; set;} 
} 

連載:

private static string SerializeXml<T>(T item) 
{ 
    DataContractSerializer ser = new DataContractSerializer(item.GetType()); 

    StringBuilder sb = new StringBuilder(); 
    XmlWriterSettings settings = new XmlWriterSettings { OmitXmlDeclaration = true, ConformanceLevel = ConformanceLevel.Fragment }; 
    using (XmlWriter writer = new XmlWriter(sb, settings)) 
    { 
     ser.WriteObject(writer, item); 
    } 
    return sb.ToString(); 
} 

看看這裏的XmlSerializer和DataContractSerializer的差異:http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/

1

binaryformatter序列化私有和甚至只讀字段,而不需要屬性。 XmlSerializer只能使用公共無參數構造函數和公共屬性進行序列化。如果你想使用封裝的XmlSerializer,你可以使用IXmlSerializable,但這很痛苦。

如果您的對象模型非常簡單,或者您可以通過引入用於序列化的特殊DTO(例如爲了避免結構)而使其非常簡單(例如,爲了避免結構),那麼我建議使用基於合約的序列化器來序列化私有字段或屬性。看看protobuf-net。