Serializable特性有何作用
分析问题
对象实例的序列化,是指把实例对象转换为可方便存储、传输和交互的流。而对象的实例则包含类型的成员变量、类型的名称以及对象所在的程序集等信息。在.NET中,通过Serializable特性提供了序列化对象实例的机制。当一个类型被申明为Serializable后,它就能被诸如BinaryFormatter等实现了IFormatter接口的类型对象进行序列化和反序列化。下面的代码展示了如何为一个类型定义Serializable特性。
[Serializable] public class MyObject { private int myInt; private string myString; public MyObject(int i, string s) { myInt = i; myString = s; } }
可以通过申明Serializable特性来使类型的对象可以被序列化,同时,对于一些特殊的不希望被序列化的成员,可以为其添加NonSerialized特性。以下代码展示了Serializable和NonSerialized特性的使用方法。
using System; using System.Text; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.IO; namespace Test { class UseSerializable { static void Main() { MyObject obj = new MyObject(10, "我是字符串"); Console.WriteLine("初始状态:"); Console.WriteLine(obj); //序列化对象 byte[] bytes = Serialize(obj); //反序列化对象 MyObject newObj = DeSerialize(bytes); Console.WriteLine("经过序列化和反序列化后:"); Console.WriteLine(newObj); Console.Read(); } //序列化对象 static byte[] Serialize(MyObject obj) { //二进制序列化 IFormatter formatter = new BinaryFormatter(); using (MemoryStream ms=new MemoryStream ()) { formatter.Serialize(ms, obj); return ms.ToArray(); } } //反序列化对象 static MyObject DeSerialize(byte[] bytes) { IFormatter formatter = new BinaryFormatter(); using (MemoryStream ms = new MemoryStream (bytes)) { return formatter.Deserialize(ms) as MyObject; } } } //一个可序列化的类型 [Serializable] public class MyObject { int _myInt; [NonSerialized] string _myPrivate; public MyObject(int i, string s) { _myInt = i; _myPrivate = s; } public override string ToString() { return new StringBuilder().AppendFormat("整数是:{0}\r\n字符串是:{1}",_myInt.ToString(),_myPrivate).ToString(); } } }
在以上代码中,为了展示Serializable和NonSerialized的特性,笔者使用了BinaryFomatter类型对MyObject的一个对象实例进行了序列化和反序列化,BinaryFormatter是一个实现了IFormatter接口的类型,关于BinaryFormatter和其他可进行序列化和反序列化操作的类型,后续小节将有覆盖。现在读者可以着重观察序列化前后对象的变化:对于_myInt成员,其顺利地通过反序列化还原了初始值:而_myPrivate成员,由于NonSerialized的作用而丢失了初始值。下面是程序的执行结果:
注意
当一个基类使用了Serializable特性之后,并不意味着其所有的子类都能被序列化。事实上,程序员必须为每个子类都添加Serializable特性来保证其能被正确地序列化。
答案
通过为类型添加Serializable特性,可以使对象申明为可被序列化,即可被诸如BinaryFormatter等类型的对象序列化和反序列化。
posted on 2014-08-14 16:35 wangjinpeng_study 阅读(711) 评论(0) 收藏 举报
浙公网安备 33010602011771号