zoukankan      html  css  js  c++  java
  • c# 序列化BinaryFormatter、SoapFormatter和XmlSerializer的区别

    在C#中常见的序列化的方法主要也有三个:BinaryFormatter、SoapFormatter、XML序列化

    1.BinaryFormatter

    序列化

    [Serializable] //如果要想保存某个class中的字段,必须在class前面加个这样attribute(C#里面用中括号括起来的标志符)
    public class Person
    {
        public int age;
    
        public string name;
    
        [NonSerialized] //如果某个字段不想被保存,则加个这样的标志
    
        public string secret;
    
    }
    
    class Program
    {
        static void Main(string[] args)
        {
    
            Person person = new Person();
    
            person.age = 18;
    
            person.name = "tom";
    
            person.secret = "i will not tell you";
    
            FileStream stream = new FileStream(@"c:	empperson.dat", FileMode.Create);
    
            BinaryFormatter bFormat = newBinaryFormatter();
    
            bFormat.Serialize(stream, person);
    
            stream.Close();
        }
    }

    反序列化

    Person person = new Person();
    
    FileStream stream = new FileStream(@"c:	empperson.dat", FileMode.Open);
    
    BinaryFormatter bFormat = new BinaryFormatter();
    
    person = (Person)bFormat.Deserialize(stream);//反序列化得到的是一个object对象.必须做下类型转换
    
    stream.Close();
    
    Console.WriteLine(person.age + person.name + person.secret);//结果为18tom.因为secret没有有被序列化.

    2.SoapFormatter

    把数据保存成xml文件.里面除了保存的内容还有些额外的Soap信息.它的用法和BinaryFormatter一样.只要把BinaryFormatter都替换成SoapFormatter就行.

    把文件名改为person.xml

    另外就是添加名称空间:using System.Runtime.Serialization.Formatters.Soap;

    这个名称空调对就的程序集有时VS没有自动引用.你必须手动去引用.选中project,右击选择Add Reference.在.NET的标签下选择

    System.Runtime.Serialization.Formatters.Soap.然后点OK.

    补充:SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分:SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例; SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交换信息。

    3.XmlSerializer

    也是保存成XML文件.但没有其他额外信息.另外它只能保存public类型的字段.而其他两种类型能保存所以类型的字段.

    序列化

    Person person = new Person();
    
    person.age = 18;
    
    person.name = "tom";
    
    person.secret = "i will not tell you";
    
    FileStream stream = new FileStream(@"c:	empxmlFormat.xml", FileMode.Create);
    
    XmlSerializer xmlserilize = new XmlSerializer(typeof(Person));
    
    xmlserilize.Serialize(stream, person);
    
    stream.Close();

    反序列化

    Person person = new Person();
    
    FileStream stream =new FileStream(@"c:	empxmlFormat.xml",FileMode.Open);
    
    XmlSerializerxmlserilize = new XmlSerializer(typeof(Person));
    
    person = (Person)xmlserilize.Deserialize(stream);
    
    stream.Close();
    
    Console.WriteLine(person.age + person.name + person.secret);

    总结:

    两个的用法大致如下:

    序列化:

      1.得到一个存储对象的类型

      2.创建一个写入文件流

      3.定义要序列化的类型

      4.调用序列化方法

    反序列化:

      1.定义一个装载对象的类型

      2.创建一个读出文件流

      3.定义要反序列化的类型

      4.调用反序列化方法

    BinaryFormatter类进行序列化和反序列化,以缩略型二进制格式写到一个文件中去,速度比较快,而且写入后的文件已二进制保存有一定的保密效果。标记为NonSerialized的其他所有成员都能序列化。

    采用xml序列化的方式只能保存public的字段和可读写的属性,对于private等类型的字段不能进行序列化。

    二进制序列化的优点: 

      1. 所有的类成员(包括只读的)都可以被序列化;

      2. 性能非常好。

    XML序列化的优点:

      1. 互操作性好;

      2. 不需要严格的二进制依赖;

      3. 可读性强

    SoapFormatter微软淘汰了,,不能序列化泛型,这里就不多讲了。

  • 相关阅读:
    在同一asp.net website工程中引用app_code中定义的control
    perl中的ppm 安装包时,如果通过代理如何下载最新的包及离线安装的问题
    利用htc s900拨号上联通3G网
    转载一篇有关ramdisk 的使用的文章
    .net dataTable对象的处理性能
    TPlink 340G+设置外网访问内网机器
    C++中的const关键字(zz)
    存在 汪峰
    ETW (Event Tracing for Windows)介绍
    理解smart pointer之一(auto_ptr介绍)
  • 原文地址:https://www.cnblogs.com/caoyc/p/6483914.html
Copyright © 2011-2022 走看看