XML序列化是.net框架中大多数webService的技术基础。
XML 序列化是一种误称,其实术语"XML 映射(Mapping)";
XML序列化基础并不是CLR的类型系统;而是XSD架构的类型系统。xml序列化提供了两者之前的映射。
了解XML架构映射到类的准则:
只有带有公有默认构造函数的类可以序列化。
只有公有字段和属性可以序列化
只读字段和属性不会被序列化
方法和其他类型信息不会被序列化
读写XML
引入System.XML.Serializer中 XMLSerializer对象有两个方法用于:Deserialize(反解析)和Serialize(解析)。
例子:
public class Text{
public string Name;
public string Url;
}
public void main(){
Text text=new Text();
text.Name="Foo";
text.Url=http://text;
//解析
XmlSerializer xml=new XmlSerializer(typeOf(Text));
FileStream stream=new FileStream("text.xml",FileMode.OpenOrCreate); //FileMode.OpenOrCreate是创建或者打开"text.xml
xml.serialzer(stream,text);
stream.Close();
//反解析
XmlSerializer xml2=new XmlSerializer(typeOf(Text));
FileStream stream2=new FileStream("text.xml",FileMode.Open);
Text text= (Text)xml2.Deserialize(stream2);
stream2.Close();
}
使用CanDeserialize方法用于判断根元素是否可以映射。
例子:
XmlSerializer xml2=new XmlSerializer(typeOf(Text));
FileStream stream2=new FileStream("text.xml",FileMode.Open);
XmlReader xmlread = new XmlTextReader(stream2);
if(xml2.CanDeserialize(xmlread))
{
Text text= (Text)xml2.Deserialize(stream2);
}
stream2.Close();
XMLWriter是用于XML序列化写出一个XML片断到一个当前XML文档中,那就不需要使用"<?xml......声明。
例子:
XMLSerializer ser=new XMlSerializer(typeof(Text));
FileStream stream=new FileStream("text.xml",FileModel.OpenOrCreate);
XmlTextWrite writer=new XMlTextWrite(stream,new System.Text.UTF8Encoding());
writer.WriteStartElement("Doc","http://doc");
ser.Serialze(writer,text);
stream.Close();
生成的xml文件会以
<doc?.......开头
序列化编码的XML
尽管编码XML被设计为在SOAP消息内使用,但有时候你可能想在SOAP以外使用这种XML。
这样你可以创建一个XmlSerializer对象,将会序列化你用作编码的Xml而传递对象,
所以需要在构造器中给XMlSerializer传递一个XmlTypeMapping对象,而不是Type对象,
可以使用SoapReflectionImporter类的ImportTypeMapping方法创建这个对象XmlTypeMapping对象
XmlTypeMapping xmlMapp=(new SoapReflectionImporter()).ImportTypeMapping(typeOf(Text));
XmlSerializer xmlser=new XmlSerializer(xmlMapp);
FileStream stream=new FileStream("text.xml",FileMode.OpenOrCreate);
xmlser.Serialize(stream,text);
stream.Close();
如果你要控制成员序列化后的元素名字,你可以用SoapElement特性来,
如果你要控制类的命名空间和根元素名字可以使用SoapType特性。
自定义序列化
先前的例子中在类和成员上使用特性会影响到它所序列化的XML。
序列化XML默认命名空间:
public class Address {
public string street;
public string city;
public string state;
public string zipCode;
}