对象序列化图
Message message1 = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "urn:SomeAction", "Hello Anders~");
Console.WriteLine(message1.ToString());
//<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">
// <s:Header>
// <a:Action s:mustUnderstand="1">urn:SomeAction</a:Action>
// </s:Header>
// <s:Body>
// <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Hello Anders~</string>
// </s:Body>
//</s:Envelope>
Console.ReadKey();
class Program
{
static void Main()
{
Person personF = new Person() { Name = "Anders.F" };
Person personM = new Person() { Name = "Anders.M" };
Person person = new Person() { Name = "Anders", father = personF, mother = personM };
Message message1 = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "urn:SomeAction", person);
Console.WriteLine(message1.ToString());
//<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">
// <s:Header>
// <a:Action s:mustUnderstand="1">urn:SomeAction</a:Action>
// </s:Header>
// <s:Body>
// <Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/XMLDictionaryWriter">
// <_x003C_Name_x003E_k__BackingField>Anders</_x003C_Name_x003E_k__BackingField>
// <_x003C_father_x003E_k__BackingField>
// <_x003C_Name_x003E_k__BackingField>Anders.F</_x003C_Name_x003E_k__BackingField>
// <_x003C_father_x003E_k__BackingField i:nil="true" />
// <_x003C_mother_x003E_k__BackingField i:nil="true" />
// </_x003C_father_x003E_k__BackingField>
// <_x003C_mother_x003E_k__BackingField>
// <_x003C_Name_x003E_k__BackingField>Anders.M</_x003C_Name_x003E_k__BackingField>
// <_x003C_father_x003E_k__BackingField i:nil="true" />
// <_x003C_mother_x003E_k__BackingField i:nil="true" />
// </_x003C_mother_x003E_k__BackingField>
// </Person>
// </s:Body>
//</s:Envelope>
}
}
//Person类必须被标记为可序列化
[Serializable]
class Person
{
public Person father { get; set; }
public Person mother { get; set; }
public string Name { get; set; }
}
XMLDictionaryReader类型
XmlDictionaryReader是为了读取序列化的和编码过的XML Infosets,并且可以有选择性地借助XmlDictionary来实现语义压缩的反向处理。
XmlDictionaryQuotas类型是一个状态容器,用来定义与XML反序列化相关的重要阀值。
OnXmlDictionaryReaderClose委托在XmlDictionaryReader的Close方法结束时调用。
using (MemoryStream stream = new MemoryStream())
{
using (XmlDictionaryWriter xtw = XmlDictionaryWriter.CreateBinaryWriter(stream, null, null))
{
xtw.WriteElementString("Person", "urn:Andersoft", "Mike");
xtw.Flush();
stream.Position = 0;
using (XmlDictionaryReader xdr = XmlDictionaryReader.CreateBinaryReader(
stream,
null,
quotas: new XmlDictionaryReaderQuotas(), //阀值
session: null,
onClose: delegate { Console.WriteLine("closing reader..."); })) //onClose委托
{
xdr.MoveToContent();
File.WriteAllText(@"c:\file.txt", xdr.ReadOuterXml());
//<Person xmlns="urn:Andersoft">Mike</Person>
Console.WriteLine("prepare to close reader...");
}
Console.WriteLine("reader was closed...");
//prepare to close reader...
//closing reader...
//reader was closed...
}
}
借助XmlDictionary生成XML数据
using (MemoryStream stream = new MemoryStream())
{
XmlDictionary xd = new XmlDictionary();
List<XmlDictionaryString> stringList = new List<XmlDictionaryString>();
stringList.Add(xd.Add("Person"));
stringList.Add(xd.Add("urn:Andersoft"));
using (XmlDictionaryWriter xtw = XmlDictionaryWriter.CreateBinaryWriter(stream, xd, null))
{
xtw.WriteElementString(stringList[0], stringList[1], "Mike");
xtw.Flush();
stream.Position = 0;
using (XmlDictionaryReader xdr = XmlDictionaryReader.CreateBinaryReader(
stream,
xd, //同一个XmlDictionary对象这里!!!!
quotas: new XmlDictionaryReaderQuotas(), //阀值
session: null,
onClose: delegate { Console.WriteLine("closing reader..."); })) //onClose委托
{
xdr.MoveToContent();
File.WriteAllText(@"c:\file.txt", xdr.ReadOuterXml());
//<Person xmlns="urn:Andersoft">Mike</Person>
Console.WriteLine("prepare to close reader...");
}
Console.WriteLine("reader was closed...");
//prepare to close reader...
//closing reader...
//reader was closed...
}
}
Console.ReadKey();
}
此时需要注意的是XmlDictionaryWriter与XmlDictionaryReader使用的是同一XmlDictionary对象。