分析问题
为了序列化具体实例到某种专业的格式,.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修饰的成员。
.NET提供了哪几种可进行序列化操作的类型