我是否正确地认为,为了让 C# 序列化一个对象,我必须为每个需要存储其状态的字段拥有一个公共(public)属性?
如果是这样,那是不是非常糟糕,因为它削弱了(如果不是完全破坏的话)我的类的任何封装?
在 Java 中,XStream 可以遍历每个非 transient 字段并将其归档。在 C# 中,这不可能发生,更糟糕的是,字典之类的东西根本不会序列化。有点乱,不是吗?
我看过 XStream 到 .net 的“端口”的 DLL,但没有文档,我很怀疑。
最佳答案
您应该使用 DataContractSerializer,并用 [DataMember]
标记您想要序列化的每个属性/字段。它不在乎您的字段是私有(private)的还是公共(public)的。顺便说一句,你可以用它序列化字典......
[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/
关于C# XML 序列化 - 削弱封装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8297291/