《WCF技术内幕》22:第2部分_第5章_消息:XmlDictionaryWriter

(概述:这一部分介绍了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>

时间: 2024-11-03 14:11:25

《WCF技术内幕》22:第2部分_第5章_消息:XmlDictionaryWriter的相关文章

《WCF技术内幕》翻译15:第1部分_第3章_消息交换模式、拓扑与编排:消息拓扑

<WCF技术内幕>翻译15:第1部分_第3章_消息交换模式.拓扑与编排:消息拓扑.消息编排和本章小结 消息拓扑 消息拓扑描述的是在一个或多个发送者和接受者之间消息如何发送的.消息拓扑可以描述简单的应用-应用的连接关系,但是它同样可以描述复杂的应用-企业的连接.在后续文章里,面向服务的应用的作用会显现出来.概括地说,这些可能存在的拓扑结构比面向组件的应用系统能够涉及到的情况会更加多.更加复杂. 某种层次上,一个消息拓扑是一个或者多个消息交换模式(MEP)的组合.实际上可能存在有无数种拓扑结构,但

《WCF技术内幕》翻译14:第1部分_第3章_消息交换模式、拓扑与编排…

<WCF技术内幕>翻译14:第1部分_第3章_消息交换模式.拓扑与编排:消息交换模式(MEP) 第3章:消息交换模式.拓扑和编排 当设计消息应用系统的时候,有必要考虑一下消息是怎样在发送者.中介者 和接受者(前面章节介绍了这些消息参与者)流转的.系统中消息交换可能性的 波动的值可以被不同程度地详细描述.这些不同级别的细节就是总所周知的消息 交换模式(MEPS).消息拓扑和消息编排[老徐备注1].当从总体来看时,这 三个级别的细节让我们抽象地描述任何消息场景.本章会详细剖析消息交换模式 (MEP

《WCF技术内幕》翻译6:第1部分_第2章_面向服务:概述、快速定义…

<WCF技术内幕>翻译6:第1部分_第2章_面向服务:概述.快速定义面向服务.理解消息 概述 互联网上充斥着面向服务(SO)的对话,大部分会话都是抽象地描述为面向 服务.这一章我们会一些不同的方法.下面一些章页,我们会站在需求的角度看 一下面向服务.更具体地说,我们将看一下一般的消息应用和需要什么才能使他 们运转.通过这个过程,我们将发掘几个理解面向服务必需的几个概念.本章的 最后几段会给出面向服务的比较正式的定义,并且会讨论一下为什么当今世界里 面向服务对于分布式计算意义重大. 如果你问10

WCF技术内幕

<WCF技术内幕>39:第2部分_第7章_通道管理器:通道工厂和本章 <WCF技术内幕>38:第2部分_第7章_通道管理器:通道侦听器 <WCF技术内幕>37:第2部分_第7章_通道管理器:概述和通道管理 <WCF技术内幕>36:第2部分_第6章_通道:创建自定义通道和本章 <WCF技术内幕>35:第2部分_第6章_通道:通道功能 <WCF技术内幕>34:第2部分_第6章_通道:通道接口和基本类型 <WCF技术内幕>33:

《WCF技术内幕》26

<WCF技术内幕>26:第2部分_第5章_消息:Buffered vs Streamed.序列化和反序列化消息 Buffered vs. Streamed消息 当我们在终结点之间流动的消息时,我们会本能地想到缓存.换个方式来说 ,我们假设程序接收到一个Message时,它已经知道整个Message.这种方式称作 缓存模式(buffering).与之相对的就是流处理模式(streaming),并且有2种 流处理模式(streaming).第一种是推模型(push model),发送者按照自己 的

《WCF技术内幕》23

<WCF技术内幕>23:第2部分_第5章_消息:XmlDictionaryReader和回到Message XmlDictionaryReader类型 XmlDictionaryReader抽象类型继承自System.Xml.XmlReader,因此继承了很 多XmlReader的特性.和XmlReader 一样,XmlDictionaryReader定义了几个工厂 方法,他们返回的是XmlDictionaryReader的子类型的实例.更确切地说, XmlDictionaryReader包装

《WCF技术内幕》翻译2:《WCF技术内幕》绪论

总述 服务是现代软件架构的一个主要部分,WCF是构建基于Microsoft Windows系 统的服务程序平台.WCF编写的服务可以与其它供应商的服务交互(例如, IBM, BEA, and Novell),WCF为行业标准的演化提供了足够的空间.对于传输,WCF 支持TCP/IP.HTTP. Microsoft消息队列 (MSMQ).命名管道.WCF同样支持一系 列WS-*规范(读作WS-星)协议,比如WS-Addressing, WS-ReliableMessaging (WS-RM), W

《WCF技术内幕》翻译1:《WCF技术内幕》目录和作者简介

翻译序言: 我现在推荐一本很好的WCF学习书籍:<Inside Microsoft Windows Communication Foundation>.Justin Smith先生所著.2007年出版至今,在亚 马逊网站上评价也比较高.综合评价4星半.是一本不错的深入学习WCF的书籍. 我在搜索了很久以后,发现这本书目前还没有中文译本.随计划翻译.分享给国 内的WCF技术爱好者.翻译工作对我个人也是一次新的尝试,希望这本书的翻译 能给大家的学习带来帮助.另外如有技术问题或翻译不当,都可以留言交

ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区

原文:ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 入门案例分析 在第一章里,我们已经对ArcGIS系列软件的体系结构有了一个全面的了解,接下来在本章中,将通过一个案例来熟悉ArcGIS for Desktop的使用,从解决问题的过程中,逐渐适应ArcGIS桌面的界面和操作方式. 本章的练习数据是一个住宅小区的简单平面示意图,需要在已有的基础上把楼房的轮廓补充完整,并加以整饰,完成一幅地图. 1.1 打开地图文档并浏览

ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区

原文:ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区 1 用ArcMap制作地图 作为ArcGIS for Desktop的组成部分之一,ArcMap用于数据的浏览.编辑.显示.查询.地图排版等.ArcMap和ArcCatalog一起构成了完整的数据处理与管理分析的功能.在前一章中已经介绍了ArcCatalog的使用,本章中将介绍ArcMap的使用.本章的例子依然使用第4章里的小区平面图示例,但是将从原理的角度做更加