C#XML序列化 - 弱化封装?

时间:2011-11-28 14:26:39

标签: c# .net serialization encapsulation xstream

我认为,为了让C#序列化一个对象,我必须为每个需要存储状态的字段设置一个公共属性吗?

如果是这样,那是不是非常非常糟糕,因为它削弱了(如果没有完全打破)我班级的任何封装?

在Java中,XStream可以迭代每个非瞬态字段并将其存档。在C#中,这不可能发生,只是为了使事情变得更糟,像字典这样的东西不会在所有情况下序列化。这有点乱,不是吗?

我已经看到了用于XStream到.net的“端口”的DLL,但是没有文档,我很怀疑。

2 个答案:

答案 0 :(得分: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 :(得分:1)

binaryformatter序列化私有和甚至只读字段,而不需要属性。 XmlSerializer只能使用公共的无参数构造函数和公共属性进行序列化。如果你想使用封装的XmlSerializer你可以使用IXmlSerializable,但这是相当痛苦的。

如果您的对象模型相当简单,或者您可以通过引入特殊的DTO:s来进行序列化(例如避免结构化),那么我建议使用可以序列化私有字段或属性的基于合同的序列化程序。看看protobuf-net。