.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点了,我要洗洗睡了。下节我们将介绍序列化的版本控制。