• 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;

      }

  • 相关阅读:
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
  • 原文地址:https://www.cnblogs.com/jzhou/p/3167384.html
Copyright © 2020-2023  润新知