C# XML序列化、反序列化

121 阅读3分钟

  1、序列化

XML要序列化到流中

可以更改命名空间

实例化数据

 1是对应根元素,2 加上  [XmlAttribute("SchoolLevel")]可以将成员写成属性 ()里面可以写字符串为别名, 3  [XmlElement("Name", Order = 1)]将成员写成子元素, 4 Order 属性可以调整顺序从0开始。

2、反序列化

注意XML文件格式

3、注意 XML 跟JSON不太一样有很多限制(如无法序列化字典等)

在C#进行XML序列化时,类可以包含的数据类型有一定的限制。理解这些限制对于有效地使用XML序列化功能至关重要。本文将详细介绍在进行XML序列化时,C#类不可以包含的数据类型,并解释其背后的原因。

首先,不是所有的.NET数据类型都可以被XML序列化。以下是一些不能进行XML序列化的数据类型:

1. **不支持的.NET数据类型**
   - **指针类型 (Pointers)**:C#中的指针类型无法被XML序列化。这是因为XML序列化器不知道如何将内存地址转换为XML格式。
   - **函数指针 (Delegates)**:在C#中,代理相当于函数指针,它们同样不能被序列化。
   - **静态成员 (Static members)**:静态成员属于类型本身,而不是类型的实例,因此不能被序列化。

2. **不支持的.NET集合类型**
   - **数组 (Arrays)**:数组可以被序列化,但是它们的序列化方式可能与人们期望的不同。例如,一维数组会被序列化为一个包含子元素的集合,这可能导致一些意想不到的结果。
   - **字典 (Dictionaries)**:字典类型(如Dictionary<TKey, TValue>)不能直接序列化。然而,可以通过将字典转换为可序列化的自定义对象来解决此问题。

3. **其他不支持的类型**
   - **文件流 (FileStreams) 和图像 (Images)**:这些类型通常不能直接序列化,因为它们包含了非序列化的二进制数据。如果需要序列化这些类型的数据,可以将它们转换为字节数组或其他可序列化的格式。
   - **数据库连接 (Database Connections)**:如SqlConnection等类型不能被序列化,因为它们包含了指向打开的数据库连接的不安全指针。

4. **自定义类型**
   - **不可变的类 (Immutable classes)**:没有无参构造函数的类或标记为不可变的对象不能被XML序列化,因为序列化器需要一个无参构造函数来创建对象的实例。
   - **循环引用 (Circular references)**:如果一个对象直接或间接地引用自己的情况称为循环引用。XML序列化器无法处理这种情况,因为它会导致无限循环。
   - **非公共成员 (Non-public members)**:只有公共成员可以被序列化。私有或受保护的成员将被忽略。
   - **多态 (Polymorphism)**:尽管多态是面向对象编程的一个强大特性,但在XML序列化中它可能导致问题。当基类和派生类都具有[Serializable]属性时,需要在基类中添加`[XmlInclude(typeof(DerivedClass))]`属性,以便序列化器知道如何处理派生类的实例。

总的来说,了解并避免这些不支持的数据类型是确保XML序列化顺利进行的关键。在进行XML序列化之前,开发者应仔细检查他们的类定义,确保所有成员都是可序列化的,并且没有违反上述任何规则。通过遵循这些最佳实践,可以最大限度地减少因数据类型不兼容而导致的错误,从而提高软件开发的效率和质量。

参考链接:

https://www.cnblogs.com/guogangj/p/7489218.html