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

标签 c# .net serialization encapsulation xstream

我是否正确地认为,为了让 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/

相关文章:

.NET TimeZoneInfo 关于夏令时的错误

java - 如何反序列化实体,将其置于托管上下文中,但不保留任何更改?

java - jackson 序列化忽略负值

kotlin - 如何(反)序列化生成的数据类的实例

c# - 在自定义对象集合上使用 LINQ 时,IEquatable<T>、IEqualityComparer<T> 和覆盖 .Equals() 之间的区别?

c# - 引发订阅的异步事件后,对象会自动处理吗?

c# - 如何从 Windows 服务调用 Web API

c# - 如何使紧凑的框架自定义控件支持 AutoScale

c# - 在强命名程序集中托管时在运行时加载 XAML 标记时出错

c# - 在不创建 2 个版本的情况下将文档和元数据添加到文档库