[转载].NET中序列化(三)

[转载].NET中序列化(三) – 人道编程 – 博客园.

导航:

.NET中序列化(一)

.NET中序列化(二)

—————————————————————————————————————————-

经过前两章的介绍,我想大家应该对序列化有了一定基础认识了,本节将介绍序列化泛型,和序列化事件

序列化泛型

其实泛型和非泛型其实没有什么不同,不过要注意以下两点:

1.泛型只支持BinaryFormatter格式,不支持SOAP格式

2.泛型序列化的类型和反序列化的类型要一致,如果把MyClass<int> 类型序列化,你不能反序列化出MyClass<string>类型。

    [Serializable]
    public class MyClass<T>
    {
        public string Name
        {
            get;
            set;
        }
        public int Age
        {
            get;
            set;
        }
        public T MyWork
        {
            get;
            set;
        }
    }

    [Serializable]
    public class Work
    {
        public string Name
        {
            set;
            get;
        }
        public string Address
        {
            set;
            get;
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            MyClass<Work> my = new MyClass<Work>();
            my.Name = "凤姐";
            my.Age = int.MaxValue;

            Work work = new Work();
            work.Address = "你家隔壁";
            work.Name = "不知道";
            my.MyWork = work;

            //泛型只支持BinaryFormatter格式,不支持SOAP格式
            System.Runtime.Serialization.IFormatter formatter = new BinaryFormatter();

            //创建一个文件流
            Stream stream = new FileStream(@"c:\MyClass.bin", FileMode.Create, FileAccess.Write);

            using (stream)
            {
                //这里就是进行序列化了
                formatter.Serialize(stream, my);
            }
        }
    }

序列化事件

序列化事件在命名空间using System.Runtime.Serialization中,事件共分四个,分别是

OnSerializing:序列化发生之前

OnSerialized:序列化发生之后

OnDeserializing:反序列化发生之前

OnDeserialized:反序列化发生之后

 1     [Serializable]
 2     public class MyClass
 3     {
 4         //数据库连接字符串
 5         string connectionString = "";
 6         [NonSerialized]
 7         SqlConnection conn;
 8         public SqlConnection Conn
 9         {
10             get
11             {
12                 return conn;
13             }
14             set
15             {
16                 conn = value;
17             }
18         }
19 
20         public string Name
21         {
22             get;
23             set;
24         }
25 
26         public int Age
27         {
28             get;
29             set;
30         }
31 
32         [OnSerializing]
33         void OnSerializing(StreamingContext context)
34         {
35         }
36 
37         [OnSerialized]
38         void OnSerialized(StreamingContext context)
39         {
40         }
41 
42         [OnDeserializing]
43         void OnDeserializing(StreamingContext context)
44         {
45         }
46 
47         //因为数据连接不好被序列化,所以反序列化时就为NULL了,我们就应该在反序列化发生之后的事件中人工的实例化数据连接
48         [OnDeserialized]
49         void OnDeserialized(StreamingContext context)
50         {
51             conn = new SqlConnection(connectionString);
52             conn.Open();
53         }
54 
55     }

我们利用OnDeserialized属性事件人工完成了SQLConnection的反序列化。

注意:

1.事件的签名一定要是 void <方法名>(StreamingContext context)这个样子的,context只有在高级的场景中才用到,现在先不讨论。

2.最好是把事件方法写成私有的,以避免子类的重载件方法产生异常。

好了,今天的内容说完了,晕都快12点了,我要洗洗睡了。下节我们将介绍序列化的版本控制。

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏