此页面有用吗?
您对此内容的反馈非常重要。 请告诉我们您的想法。
更多反馈?
1500 个剩余字符
MSDN Library
信息
您所需的主题如下所示。但此主题未包含在此库中。

XmlSerializer 类

2013/12/13

将对象序列化到 XML 文档中和从 XML 文档中反序列化对象。XmlSerializer 使您能够控制如何将对象编码到 XML 中。

System.Object
  System.Xml.Serialization.XmlSerializer

Namespace:  System.Xml.Serialization
程序集:  System.Xml.Serialization(位于 System.Xml.Serialization.dll 中)

public class XmlSerializer

XmlSerializer 类型公开以下成员。

  名称说明
受保护的方法XmlSerializer()基础结构。 初始化 XmlSerializer 类的新实例。
公共方法XmlSerializer(Type)初始化 XmlSerializer 类的新实例,该类可以将指定类型的对象序列化为 XML 文档,也可以将 XML 文档反序列化为指定类型的对象。
公共方法XmlSerializer(XmlTypeMapping)使用将一个类型映射到另一个类型的对象来初始化 XmlSerializer 类的实例。
公共方法XmlSerializer(Type, String)初始化 XmlSerializer 类的新实例,该类可以将指定类型的对象序列化为 XML 文档,也可以将 XML 文档反序列化为指定类型的对象。指定所有 XML 元素的默认命名空间。
公共方法XmlSerializer(Type, Type[])初始化 XmlSerializer 类的新实例,该类可以将指定类型的对象序列化为 XML 文档,也可以将 XML 文档反序列化为指定类型的对象。如果属性或字段返回一个数组,则 extraTypes 参数指定可插入到该数组的对象。
公共方法XmlSerializer(Type, XmlAttributeOverrides)初始化 XmlSerializer 类的新实例,该类可以将指定类型的对象序列化为 XML 文档,也可以将 XML 文档反序列化为指定类型的对象。要序列化的每个对象本身可包含类的实例,该重载可使用其他类重写这些实例。
公共方法XmlSerializer(Type, XmlRootAttribute)初始化 XmlSerializer 类的新实例,该类可以将指定类型的对象序列化为 XML 文档,也可以将 XML 文档反序列化为指定类型的对象。还可以指定作为 XML 根元素使用的类。
公共方法XmlSerializer(Type, XmlAttributeOverrides, Type[], XmlRootAttribute, String)初始化 XmlSerializer 类的新实例,该类可将 Object 类型的对象序列化为 XML 文档实例,并可将 XML 文档实例反序列化为 Object 类型的对象。要序列化的每个对象本身可包含类的实例,此重载可使用其他类重写这些实例。此重载还指定所有 XML 元素的默认命名空间和用作 XML 根元素的类。
返回顶部

  名称说明
公共方法CanDeserialize获取一个值,该值指示此 XmlSerializer 是否可以反序列化指定的 XML 文档。
公共方法Deserialize(Stream)反序列化指定 Stream 包含的 XML 文档。
公共方法Deserialize(TextReader)反序列化指定 TextReader 包含的 XML 文档。
公共方法Deserialize(XmlReader)反序列化指定 XmlReader 包含的 XML 文档。
公共方法Equals(Object)确定指定的 Object 是否等于当前的 Object (从 Object 继承。)
受保护的方法Finalize允许 Object 在垃圾回收器回收该对象之前尝试释放资源并执行其他清理操作。 (从 Object 继承。)
公共方法静态成员FromMappings(XmlMapping[])基础结构。 返回从 XmlTypeMapping 对象的数组创建的 XmlSerializer 对象的数组。
公共方法静态成员FromMappings(XmlMapping[], Type)基础结构。 从指定的映射返回 XmlSerializer 类的实例。
公共方法静态成员FromTypes返回从类型数组创建的 XmlSerializer 对象的数组。
公共方法GetHashCode用作特定类型的哈希函数。 (从 Object 继承。)
公共方法GetType获取当前实例的 Type (从 Object 继承。)
受保护的方法MemberwiseClone创建当前 Object 的浅表副本。 (从 Object 继承。)
公共方法Serialize(Stream, Object)使用指定的 Stream 序列化指定的 Object 并将 XML 文档写入文件。
公共方法Serialize(TextWriter, Object)使用指定的 TextWriter 序列化指定的 Object 并将 XML 文档写入文件。
公共方法Serialize(XmlWriter, Object)使用指定的 XmlWriter 序列化指定的 Object 并将 XML 文档写入文件。
公共方法Serialize(Stream, Object, XmlSerializerNamespaces)使用引用指定命名空间的指定 Stream 序列化指定的 Object 并将 XML 文档写入文件。
公共方法Serialize(TextWriter, Object, XmlSerializerNamespaces)使用指定的 TextWriter 序列化指定的 Object 并将 XML 文档写入文件,并且引用指定的命名空间。
公共方法Serialize(XmlWriter, Object, XmlSerializerNamespaces)使用指定的 XmlWriter 序列化指定的 Object 并将 XML 文档写入文件,并且引用指定的命名空间。
公共方法ToString返回一个字符串,它表示当前的对象。 (从 Object 继承。)
返回顶部

XML 序列化是将对象的公共属性和字段转换为序列格式(这里是指 XML)以便存储或传输的过程。反序列化则是从 XML 输出中重新创建原始状态的对象。可以将序列化视为将对象的状态保存到流或缓冲区的方法。

对象中的数据是用编程语言构造来描述的,如类、字段、属性、基元类型、数组,甚至嵌入的 XML。

在对象和 XML 之间传输数据需要从编程语言构造到 XML 架构的映射和从 XML 架构到编程语言构造的映射。XmlSerializer 在设计时和运行时都能在这两种技术之间提供一个桥梁。

控制生成的 XML

为控制所生成的 XML,可以向类和成员应用特殊特性。例如,为指定不同的 XML 元素名称,可以将 XmlElementAttribute 应用于公共字段或属性,同时设置 ElementName 属性。也可以实现 IXmlSerializable 接口以控制 XML 输出。

如果所生成的 XML 必须符合万维网联合会 (www.w3.org) 文档“简单对象访问协议 (SOAP) 1.1”的第 5 部分,则必须利用 XmlTypeMapping 构造 XmlSerializer

有了 XmlSerializer,可以利用使用强类型类的优点并仍具有 XML 的灵活性。使用字段或属性,您可以将部分 XML 文档直接读入 XML 对象中。

如果使用扩展 XML 架构,则也可以使用 XmlAnyElementAttributeXmlAnyAttributeAttribute 特性来序列化及反序列化在原始架构中找不到的元素或特性。若要使用这些对象,请将 XmlAnyElementAttribute 应用到返回对象数组的字段中,或者将 XmlAnyAttributeAttribute 应用到返回对象数组的字段中。

如果属性或字段返回一个复杂对象(如数组或类实例),则 XmlSerializer 将其转换为嵌套在主 XML 文档内的元素。例如,以下代码中的第一个类返回第二个类的实例。

public class MyClass
{
    public MyObject MyObjectProperty;
}
public class MyObject
{
    public string ObjectName;
}

已序列化的 XML 输出如下面的代码所示。

<MyClass>
  <MyObjectProperty>
  <ObjectName>My String</ObjectName>
  </MyObjectProperty>
</MyClass>

如果架构包括一个为可选 (minOccurs = '0') 的元素或包括一个默认值,使用特殊的模式创建一个由 XmlSerializer 识别的布尔字段,并将 XmlIgnoreAttribute 应用到该字段。该模式以 propertyNameSpecified 形式创建。例如,如果有一个名为“MyFirstName”的字段,那么还要创建一个名为“MyFirstNameSpecified”的字段,该字段指示 XmlSerializer 是否生成名为“MyFirstName”的 XML 元素。这在下面的示例中显示。

public class OptionalOrder
{
    // This field should not be serialized 
    // if it is uninitialized.
    public string FirstOrder;

    // Use the XmlIgnoreAttribute to ignore the 
    // special field named "FirstOrderSpecified".
    [System.Xml.Serialization.XmlIgnoreAttribute]
    public bool FirstOrderSpecified;
}

重写默认序列化

还可以通过创建某个适当的特性并将它添加到 XmlAttributes 的实例中,从而重写任何一组对象及其字段和属性的序列化。以此方式重写序列化有两个用途:首先,可以控制和扩大在 DLL 中找到的对象的序列化(即使无法访问源);其次可以创建一组可序列化的类,但以多种方式对这些对象进行序列化。有关更多信息,请参见 XmlAttributeOverrides 类。

若要序列化对象,请调用 Serialize 方法。若要反序列化对象,请调用 Deserialize 方法。

若要将 XML 命名空间添加到 XML 文档中,请参见 XmlSerializerNamespaces

说明注意:

XmlSerializer 特殊处理实现 IEnumerableICollection 的类。实现 IEnumerable 的类必须实现包含单个参数的公共 Add 方法。Add 方法的参数的类型必须与从 Current 属性(此属性在从 GetEnumerator 返回的值上)返回的类型相同,或是该类型的基之一。除了 IEnumerable 外,实现 ICollection 的类还必须有一个包含整数的公共 Item 索引属性(在 C# 中为索引器),且必须有一个整数类型的公共 Count 属性。Add 方法的参数类型必须与从 Item 属性返回的类型相同,或者为此类型的基之一。对于实现 ICollection 的类,从具有索引的 Item 属性检索要序列化的值,而不是通过调用 GetEnumerator

若要反序列化对象,必须具有写入临时目录(由 TEMP 环境变量定义)的权限。

动态生成的程序集

为了提高性能,XML 序列化基础结构动态生成程序集,以便对指定类型进行序列化和反序列化。该基础结构将找到并重新使用这些程序集。仅当使用以下构造函数时,才会发生此行为:

如果使用任何其他构造函数,则将生成同一个程序集的多个版本,这些版本始终不予卸载,从而导致内存泄漏和性能低下。最简单的解决方案是使用前面提到的两个构造函数中的一个。

ArrayList 和泛型列表的序列化

XmlSerializer 无法序列化或反序列化以下数组:

无符号长整型的枚举的序列化

如果满足下列条件,则 XmlSerializer 无法进行实例化以序列化枚举:枚举为无符号长整型(在 C# 中为 ulong),并且枚举包含值大于 9,223,372,036,854,775,807 的所有成员。例如,无法序列化以下代码。

public enum LargeNumbers: ulong
{
    a = 9223372036854775808
}
// At runtime, the following code will fail.
xmlSerializer mySerializer=new XmlSerializer(typeof(LargeNumbers));

不再序列化用 Obsolete 特性标记的对象

在 .NET Framework 3.5 中,XmlSerializer 类不再序列化标记为 [Obsolete] 的对象。

版本说明

Windows Phone

 当您在 XElement 类型的对象上使用 XML 序列化时,额外的 XElement 标记将添加到 XML 内容的开头和结尾处。

Windows Phone OS

受以下版本支持: 8.0, 7.1, 7.0

Windows Phone

此类型是线程安全的。

Microsoft 正在进行一项网上调查,以了解您对 MSDN 网站的意见。 如果您选择参加,我们将会在您离开 MSDN 网站时向您显示该网上调查。

是否要参加?
显示:
© 2015 Microsoft