(概述:这一部分介绍了XmlDictionaryWriter类型的相关概念:如何创建, 使用一个对象,然后讲述了如何进行Text、二进制和MTOM编码。最后介绍了 XmlDictionary的作用【老徐备注2】,已经各种编码的效率问题。你会了解为 WCF支持的几种编码格式的基本原理。)
XmlDictionaryWriter
XmlDictionaryWriter类型为Message类型的序列化和编码的。它继承自 System.Xml.XmlWriter,因此继承了很多XmlWriter 的属性。像XmlWriter一样 ,XmlDictionaryWriter也是抽象类型,它定义了几个返回XmlDictionaryWriter 子类型实例的方法,包装了System.IO.Stream并且定义了许多以Write单词开始 的方法。在作用上,程序里使用 XmlDictionaryWriter和XmlWriter在概念上十 分相似。
与XmlWriter不同,XmlDictionaryWriter类型的目的是序列化和编码Message 对象,并且有时会使用XmlDictionary对象处理压缩工作。为了这一目的, XmlDictionaryWriter 类型定义了一些与XmlWriter不同的成员。让我们通过研 究这些成员来详细了解一下XmlDictionaryWriter类型。首先我们会检查一下 XmlDictionaryWriter的构造函数,然后看看如何通过Stream序列化和编码XML数 据。
创建一个XmlDictionaryWriter对象
XmlDictionaryWriter定义了几个工厂方法,并且它们都直接或者间接地接受 System.IO.Stream对象的引用。这些方法大部分是重载一下4个方法: CreateDictionaryWriter、CreateTextWriter、CreateMtomWriter和 CreateBinaryWriter。
CreateDictionaryWriter XmlDictionaryWriter 类型上的工厂方法 CreateDictionaryWriter 其中之一就是接受一个XmlWriter类型的引用。内部来 说,这些方法返回的实例都是简单地包装了传递的参数XmlWriter。因此,这些 方法用处不大,除了某些API里需要XmlDictionaryWriter类型的时候。比如,你 可能要掉也难怪一个接受XmlDictionaryWriter类型参数的方法,但是你只有一 个XmlWriter类型的局部变量。假如这样的话,你可以通过调用 CreateDictionaryWriter工厂方法,传递XmlWriter参数,从XmlWriter创建 XmlDictionaryWriter对象,代码如下:
MemoryStream stream = new MemoryStream();
XmlWriter xmlWriter = XmlWriter.Create(stream);
XmlDictionaryWriter writer = XmlDictionaryWriter.CreateDictionaryWriter(xmlWriter);
CreateTextWriter XmlDictionaryWriter类型定义了三个工厂方法。这些 工厂方法返回的是继承自XmlDictionaryWriter类型的实例,并且它们的作用是 为了产生基于文本编码的XML。所有的三个方法都接受Stream类型的参数。两个 方法接受一个Stream参数和一个 System.Text.Encoding类型的参数。一个方法 接受一个Stream类型、一个Encoding和一个Boolean类型的参数。 Encoding参数 ,如你所期望的,设置处理Stream时候的编码格式。虽然有很多编码格式,但是 CreateTextWriter方法只支持三种编码格式:UTF-8 、Unicode (UTF-16) little-endian和big-endian方式。如果不选择的话,默认使用UTF-8编码。 Boolean参数表示 XmlDictionaryWriter是否拥有这个Stream对象。如果为true, 调用XmlDictionaryWriter上的Close 和Dispose方法,也会调用Stream对象的 Close方法,因此能够阻止对Stream 的后续访问。如果没有设置的话,默认为 true.下面的代码演示了如何使用CreateTextWriter方法:
MemoryStream stream = new MemoryStream();
using (XmlDictionaryWriter writer =
XmlDictionaryWriter.CreateTextWriter(stream, Encoding.UTF8, false)) {
writer.WriteStartDocument();
writer.WriteElementString("SongName",
"urn:ContosoRockabilia",
"Aqualung");
writer.Flush();
}
Console.WriteLine("XmlDictionaryWriter (Text-UTF8) wrote {0} bytes",
stream.Position);
stream.Position = 0;
Byte[] bytes = stream.ToArray();
Console.WriteLine(BitConverter.ToString(bytes));
Console.WriteLine("data read from stream:\n{0}\n",
new StreamReader(stream).ReadToEnd());
当代码运行的时,它会产生下面的输出:
XmlDictionaryWriter (Text-UTF8) wrote 97 bytes3C-3F-78- 6D-6C-20-76-65-72-73-69-6F-6E-3D-22-31-2E-30-22-20-65-6E-63-6F-64-69- 6E-67-3D-2275-74-66-2D-38-22-3F-3E-3C-53-6F-6E-67-4E-61-6D-65-20-78- 6D-6C-6E-73-3D-22-75-72-6E-3A-436F-6E-74-6F-73-6F-52-6F-63-6B-61-62- 69-6C-69-61-22-3E-41-71-75-61-6C-75-6E-67-3C-2F-53-6F6E-67-4E-61-6D- 65-3E
data read from stream:
<?xml version="1.0" encoding="utf-8"?>
<SongName xmlns="urn:ContosoRockabilia">Aqualung</SongName>