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

C#XML序列化-弱化封装?,c#,.net,serialization,encapsulation,xstream,C#,.net,Serialization,Encapsulation,Xstream,我是否正确地认为,为了让C#序列化对象,我必须为每个需要存储其状态的字段设置公共属性 如果是这样,这不是很糟糕,因为它削弱了(如果不是完全破坏的话)我的类的任何封装 在Java中,XStream可以迭代每个非瞬态字段并将其存档。在C语言中,这是不可能发生的,更糟糕的是,字典之类的东西根本不会序列化。都有点乱,不是吗 我见过XStream到.net的“端口”的DLL,但没有文档,我对此表示怀疑。binaryformatter序列化私有甚至只读字段,而不需要属性。XmlSerializer只能使用公

我是否正确地认为,为了让C#序列化对象,我必须为每个需要存储其状态的字段设置公共属性

如果是这样,这不是很糟糕,因为它削弱了(如果不是完全破坏的话)我的类的任何封装

在Java中,XStream可以迭代每个非瞬态字段并将其存档。在C语言中,这是不可能发生的,更糟糕的是,字典之类的东西根本不会序列化。都有点乱,不是吗


我见过XStream到.net的“端口”的DLL,但没有文档,我对此表示怀疑。

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


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

您应该使用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();
}
私有静态字符串序列化XML(T项)
{
DataContractSerializer ser=新的DataContractSerializer(item.GetType());
StringBuilder sb=新的StringBuilder();
XmlWriterSettings=new XmlWriterSettings{OmitXmlDeclaration=true,ConformanceLevel=ConformanceLevel.Fragment};
使用(XmlWriter=newxmlwriter(sb,设置))
{
ser.WriteObject(writer,item);
}
使某人返回字符串();
}

在这里查找XmlSerializer和DataContractSerializer之间的差异:

如果我记得很清楚,我认为getter必须是公共的,而不是setter。