我正確地認爲,爲了讓C#能夠序列化一個對象,我必須爲需要其狀態存儲的每個字段提供一個公共屬性?C#XML序列化 - 弱化封裝?
如果是這樣,是不是非常非常爛,因爲它削弱(如果不完全中斷)我的類的任何封裝?
在Java中,XStream可以迭代每個非瞬態字段並對其進行存檔。在C#中,這不會發生,只是爲了讓事情變得更糟,像Dictionaries這樣的東西不會序列化AT ALL。這一切都是一團糟,不是嗎?
我已經看到XStream的「端口」爲.net的DLL,但沒有文檔,我很懷疑。
我正確地認爲,爲了讓C#能夠序列化一個對象,我必須爲需要其狀態存儲的每個字段提供一個公共屬性?C#XML序列化 - 弱化封裝?
如果是這樣,是不是非常非常爛,因爲它削弱(如果不完全中斷)我的類的任何封裝?
在Java中,XStream可以迭代每個非瞬態字段並對其進行存檔。在C#中,這不會發生,只是爲了讓事情變得更糟,像Dictionaries這樣的東西不會序列化AT ALL。這一切都是一團糟,不是嗎?
我已經看到XStream的「端口」爲.net的DLL,但沒有文檔,我很懷疑。
您應該使用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/
binaryformatter序列化私有和甚至只讀字段,而不需要屬性。 XmlSerializer只能使用公共無參數構造函數和公共屬性進行序列化。如果你想使用封裝的XmlSerializer,你可以使用IXmlSerializable,但這很痛苦。
如果您的對象模型非常簡單,或者您可以通過引入用於序列化的特殊DTO(例如爲了避免結構)而使其非常簡單(例如,爲了避免結構),那麼我建議使用基於合約的序列化器來序列化私有字段或屬性。看看protobuf-net。
如果我記得很清楚,我想吸必須是公開的,而不是二傳手。 – Exort