持久化,.NET中序列化和持久化(三)

导航:
.NET中序列化和持久化(一)
.NET中序列化和持久化(二)
----------------------------------------------------------------------------------------------------------------------------
经过前两章的介绍,我想大家应该对序列化有了一定基础认识了,本节将介绍序列化泛型,和序列化事件
序列化泛型
其实泛型和非泛型其实没有什么不同,不过要注意以下两点:
1.泛型只支持BinaryFormatter格式,不支持SOAP格式
2.泛型序列化的类型和反序列化的类型要一致,如果把MyClass 类型序列化,你不能反序列化出MyClass类型。
.NET中序列化和持久化(三)持久化
[Serializable] public class MyClass { 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 my = new MyClass(); 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:反序列化发生之后
.NET中序列化和持久化(三)持久化
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 _disibledevent=>34 { 35 } 36 37 [OnSerialized] 38 void _disibledevent=>39 { 40 } 41 42 [OnDeserializing] 43 void _disibledevent=>44 { 45 } 46 47 //因为数据连接不好被序列化,所以反序列化时就为NULL了,我们就应该在反序列化发生之后的事件中人工的实例化数据连接 48 [OnDeserialized] 49 void _disibledevent=>50 { 51 conn = new SqlConnection(connectionString); 52 conn.Open(); 53 } 54 55 }
我们利用OnDeserialized属性事件人工完成了SqlConnection的反序列化。
注意:
1.事件的签名一定要是 void <方法名>(StreamingContext context)这个样子的,context只有在高级的场景中才用到,现在先不讨论。
2.最好是把事件方法写成私有的,以避免子类的重载件方法产生异常。
好了,今天的内容说完了,晕都快12点了,我要洗洗睡了。下节我们将介绍序列化的版本控制。





Tags:  java持久化 什么是持久化 对象持久化 数据持久化 持久化

延伸阅读

最新评论

发表评论