NET下的XML序列化 5

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;

  }

posted on 2013-07-02 17:07  紫色的冰  阅读(244)  评论(0编辑  收藏  举报