.NET提供了哪几种可进行序列化操作的类型

分析问题

  为了序列化具体实例到某种专业的格式,.NET提供了三种对象序列格式化类型:BinaryFormatter、SoapFormatter和XmlSerializer。

  BinaryFormatter用于将可序列化的对象序列化成二进制的字节流,而SoapFormatter则致力于把可序列化的类型序列化成符合SOAP规范的XML文档,以供使用。对于那些使用Serializable特性来申明成可序列化类型的对象,BinaryFormatter和SoapFormatter可以方便地把它们序列化成特定的格式。

说明

  SOAP是一种位于应用层的网络协议,它基于XML,并且是Web服务的基本协议,后续章节将覆盖关于SOAP的面试题。

  另外,.NET提供了一个执行序列化操作的类型XmlSerializer。不同于BinaryFormatter和SoapFormatter,XmlSerializer并不针对那些使用Serializable特性的类型,事实上,Serializable和NonSerialized特性在XmlSerializer类型对象的操作中完全不起作用,取而代之的是XmlIgnore属性。XmlSerializer可以对没有Serializable特性修饰的类型对象进行序列化,但它仍然有一定的限制:

  1、使用XmlSerializer序列化的对象类型必须显式地拥有一个无参的公共构造方法。

  2、XmlSerializer只能序列化公共成员变量。

  以下代码展示了SoapFormatter和XmlSerializer类型的使用方法,首先为了演示起见,定义一个将被用来测试序列化的简单类型。

using System;
using System.Text;
using System.Xml.Serialization;
using System.IO;
using System.Runtime.Serialization.Formatters.Soap;



namespace Test111
{
    class DoSerialize
    {
        static void Main()
        {
            MyObject obj = new MyObject(10, "我是字符串");
            Console.WriteLine("原始对象是:");
            Console.WriteLine(obj);
            //使用SoapFormatter进行序列化
            byte[] data = SoapFormatterSerialize(obj);
            Console.WriteLine("SoapFormatter序列化后:{0}\r\n",Encoding.UTF8.GetString(data));
            //使用XmlSerializer进行序列化
            byte[] data1 = XmlSerializerSerialize(obj);
            Console.WriteLine("XmlSerializer序列化后:{0}\r\n", Encoding.UTF8.GetString(data1));
            Console.Read();
        }

        //SoapFormatter序列化
        static byte[] SoapFormatterSerialize(MyObject obj)
        {
            using (MemoryStream ms=new MemoryStream ())
            {
                SoapFormatter sf = new SoapFormatter();
                sf.Serialize(ms, obj);
                return ms.ToArray();
            }
        }

        //SoapFormatter反序列化
        static MyObject SoapFormatterDeSerialize(byte[] bytes)
        {
            using (MemoryStream ms=new MemoryStream (bytes))
            {
                SoapFormatter sf = new SoapFormatter();
                return sf.Deserialize(ms) as MyObject;
            }
        }

        //使用XmlSerializer序列化
        static byte[] XmlSerializerSerialize(MyObject obj)
        {
            using (MemoryStream ms = new MemoryStream ())
            {
                XmlSerializer xs = new XmlSerializer(typeof(MyObject));
                xs.Serialize(ms, obj);
                return ms.ToArray();
            }
        }

        //使用XmlSerializer反序列化
        static MyObject XmlSerializerDeSerialize(byte[] bytes)
        {
            using (MemoryStream ms=new MemoryStream (bytes))
            {
                XmlSerializer xs = new XmlSerializer(typeof(MyObject));
                return xs.Deserialize(ms) as MyObject;
            }
        }

    }

    [Serializable]
    public class MyObject
    { 
        //私有成员,不能被XmlSerializer序列化
        private int _myInt;

        //申明不可被序列化
        [NonSerialized]
        public string _myString1;

        //申明不可被XmlSerializer序列化
        [XmlIgnore]
        public string _myString2;

        public MyObject() 
        {
            _myInt = 0;
            _myString1 = string.Empty;
            _myString2 = string.Empty;
        }

        public MyObject(int i, string s)
        {
            _myInt = i;
            _myString1 = s;
            _myString2 = s;
        }

        public override string ToString()
        {
            return new StringBuilder().AppendFormat("整数是:{0}\r\n字符串1是:{1}\r\n字符串2是:{2}",_myInt.ToString(),_myString1,_myString2).ToString();
        }

    }
}

  

 

答案

  .NET内建类型提供了三个可执行序列化和反序列化操作的类型:BinaryFormatter、SoapFormatter和XmlSerializer。BinaryFormatter和SoapFormatter可以对那些有Serializable特性的类型进行序列化和反序列化操作,除了由NonSerialized特性修饰的成员,两者将序列化所有其他的成员。而XmlSerializer不需要对对象类型申明Serializable特性,但它要求对象类型有一个显式的无参公共构造方法,并且它不能序列化对象的非公共成员和由XmlIgnore修饰的成员。

posted on 2014-08-14 17:17  wangjinpeng_study  阅读(977)  评论(0编辑  收藏  举报

导航