首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF XML 堆疊核心:XmlDictionaryReader 與 Message 完整串聯

     編輯:關於.NET

XmlDictionaryReader:專為編碼 XML Infoset 設計

繼承自 System.Xml.XmlReader,保留熟悉的 Read 方法族群,但專注於「讀取序列化/編碼過的 XML Infoset」,並支援透過 XmlDictionary 進行語意壓縮的反向處理。與 XmlDictionaryWriter 互為反向操作,物件模型高度相似。

建立實例的關鍵參數

  • 四大工廠方法:CreateDictionaryReader、CreateTextReader、CreateMtomReader、CreateBinaryReader,對應 Writer 端編碼格式。
  • XmlDictionaryReaderQuotas:定義反序列化安全閾值(最大節點深度 32、最大字串長度 8192、最大陣列長度 16384 等),防禦 DoS 攻擊。
  • OnXmlDictionaryReaderClose 委派:Close() 完成前觸發,供編碼器回收物件至池,不提供狀態資訊。

程式碼示範:Text 編碼完整循環

MemoryStream stream = new MemoryStream();
XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(stream, Encoding.BigEndianUnicode, false);
writer.WriteStartDocument();
writer.WriteElementString("SongName", "urn:ContosoRockabilia", "Aqualung");
writer.Flush(); stream.Position = 0;

XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(stream, Encoding.BigEndianUnicode,
    new XmlDictionaryReaderQuotas(), delegate { Console.WriteLine("closing reader"); });
reader.MoveToContent();
Console.WriteLine("Read XML Content:{0}", reader.ReadOuterXml());
reader.Close(); // 觸發委派輸出 "closing reader"

搭配 XmlDictionary 進行二進制語意壓縮

Writer 與 Reader 必須共享相同 XmlDictionary 實例參考:

XmlDictionary dictionary = new XmlDictionary();
List<XmlDictionaryString> list = new List<XmlDictionaryString>();
list.Add(dictionary.Add("SongName"));
list.Add(dictionary.Add("urn:ContosoRockabilia"));

using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateBinaryWriter(stream, dictionary, null)) {
    writer.WriteElementString(list[0], list[1], "Aqualung");
    writer.Flush();
}
stream.Position = 0;
XmlDictionaryReader reader = XmlDictionaryReader.CreateBinaryReader(stream, dictionary, new XmlDictionaryReaderQuotas());
reader.Read();
Console.WriteLine(reader.ReadOuterXml());
// 輸出:<SongName xmlns="urn:ContosoRockabilia">Aqualung</SongName>

二進制編碼配合字典,將 59 位元組壓縮為 14 位元組(元素名與命名空間以整數 Key 取代)。

回到 Message 型別:完整物件模型概覽

Message 約 45 個 public/protected 成員,涵蓋:

  • 工廠方法(建立實例)
  • 序列化/反序列化方法
  • 資訊屬性(版本、標頭、本文等)
  • 標頭處理屬性
  • 清理方法

後續章節將深入各功能區塊。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved