繼承自 System.Xml.XmlReader,保留熟悉的 Read 方法族群,但專注於「讀取序列化/編碼過的 XML Infoset」,並支援透過 XmlDictionary 進行語意壓縮的反向處理。與 XmlDictionaryWriter 互為反向操作,物件模型高度相似。
CreateDictionaryReader、CreateTextReader、CreateMtomReader、CreateBinaryReader,對應 Writer 端編碼格式。Close() 完成前觸發,供編碼器回收物件至池,不提供狀態資訊。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"
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 約 45 個 public/protected 成員,涵蓋:
後續章節將深入各功能區塊。