zoukankan      html  css  js  c++  java
  • 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;

      }

  • 相关阅读:
    你好,2021!
    庚子走,辛丑来,愿一切安好!
    花魂鸟魂总难留,鸟自无言花自羞
    熟悉的小胡同
    夜半听鼾声
    写在儿子22岁生日
    vue配置Azure Artifacts npm包源
    RabbitMQ出错:AMQP close-reason, initiated by Peer, code=530的解决办法
    .NET MVC存储图片到数据库的解决方案
    EF Core解决报错’EntityTypeBuilder未包含“ToTable”的定义‘的方法
  • 原文地址:https://www.cnblogs.com/jzhou/p/3167384.html
Copyright © 2011-2022 走看看