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

导航:
.NET中序列化和持久化(一)
----------------------------------------------------------------------------------------------------------------------------
上节说到序列化和反序列化类中的值成员,我们也知道,类中的成员不当当只是值成员还有引用类型,现在我们就介如何序列化引用类型、不可序列、序列化成SOAP格式的文件
序列化引用类型
序列化类默认的情况下是要求他的所有的成员都是要可序列化的(除事件、委托、显式定义不可序列化)
现在我对之前的例子进行改造,例子如下:
[Serializable] public class MyClass { public string Name { get; set; } public int Age { get; set; } public Work MyWork { get; set; } } [Serializable] public class Work { public string Name { set; get; } public string Address { set; get; } }
其实很简单的,就是把MyClass类中有的类成员都加上为[Serializable]属性即可,.NET会去MyClass中遍历所有的成员,智能的跳过类的循环引用。如果MyClass中的Work类型不加[Serializable]属性,那就是说Work不可序列化,那.NET就会报出错误。
不可序列化成员
如果你在MyClass中有个SqlConnection类型成员,大家都知道SqlConnection中管理的是数据库的连接,不好被序列化,所以我们在设计的时候不能把SqlConnection序列化了,我们要在SqlConnection的成员中把它加上 [NonSerialized]属性告诉.NET这个类不要被序列化,当反序列化的时候SqlConnection就为null,例子如下:
[Serializable] public class MyClass { public string Name { get; set; } public int Age { get; set; } [NonSerialized] Work myWork; public Work MyWork { get { return myWork; } set { myWork = value; } } } public class Work { public string Name { set; get; } public string Address { set; get; } }
这样Work对像就不会被序列化到文件流中,当被反序列化时就MyWork属性就为null了。
序列化SOAP文件
要序列化成SOAP就要先用引用System.Runtime.Serialization.Formatters.Soap命名空间中的SoapFormatter类了。SoapFormatter是一个Soap的格式器
.NET中序列化和持久化(二)持久化
下面展示客户端的代码
MyClass my = new MyClass(); my.Name = "凤姐"; my.Age = int.MaxValue; Work work = new Work(); work.Address = "你家隔壁"; work.Name = "不知道"; my.MyWork = work; //这里new 的是Soap格式的了 System.Runtime.Serialization.IFormatter formatter = new SoapFormatter(); //创建一个文件流 Stream stream = new FileStream(@"c:\MyClass.xml", FileMode.Create, FileAccess.Write); using (stream) { //这里就是进行序列化了 formatter.Serialize(stream, my); }
这样子就把"凤姐"这个对像序列成SOAP格式,生成到你的C盘里了(你可以郁闷下哇哈哈哈),文件内容如下
<_x003C_Name_x003E_k__BackingField id="ref-3">凤姐 <_x003C_Age_x003E_k__BackingField>2147483647 <_x003C_MyWork_x003E_k__BackingField href="#ref-4"/> <_x003C_Name_x003E_k__BackingField id="ref-5">不知道 <_x003C_Address_x003E_k__BackingField id="ref-6">你家隔壁
SOAP格式的序列化文件就有一定的可读性了,这样就可以更好的跨平台的反序列化对像了。不过从速度上来说,当然还是二进制文件更快,可是二进制文件不好进行跨平台的反序列化,各有各的优点吧。
这节说完了,下节我们我该讲该如何用泛型格式器序列化对像。

Tags: 

延伸阅读

最新评论

发表评论