[转载].NET中序列化和持久化(二) – 人道编程 – 博客园.
导航:
—————————————————————————————————————————-
上节说到序列化和反序列化类中的值成员,我们也知道,类中的成员不当当只是值成员还有引用类型,现在我们就介如何序列化引用类型、不可序列、序列化成SOAP格式的文件
序列化引用类型
序列化类默认的情况下是要求他的所有的成员都是要可序列化的(除事件、委托、显式定义不可序列化)
现在我对之前的例子进行改造,例子如下:
<span class = "pun" >[</span><span class = "typ" >Serializable</span><span class = "pun" >]</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >MyClass</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > string </span><span class = "pln" > </span><span class = "typ" >Name</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > get </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > set </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > </span><span class = "typ" >Age</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > get </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > set </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >Work</span><span class = "pln" > </span><span class = "typ" >MyWork</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > get </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > set </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >[</span><span class = "typ" >Serializable</span><span class = "pun" >]</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >Work</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > string </span><span class = "pln" > </span><span class = "typ" >Name</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > set </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > get </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > string </span><span class = "pln" > </span><span class = "typ" >Address</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > set </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > get </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span> |
其实很简单的,就是把MyClass类中有的类成员都加上为[Serializable]属性即可,.NET会去MyClass中遍历所有的成员, 智能的跳过类的循环引用。如果MyClass中的Work类型不加[Serializable]属性,那就是说Work不可序列化,那.NET就会报出错 误。
不可序列化成员
如果你在MyClass中有个SQLConnection类型成 员,大家都知道SQLConnection中管理的是数据库的连接,不好被序列化,所以我们在设计的时候不能把SQLConnection序列化了,我们 要在SqlConnection的成员中把它加上 [NonSerialized]属性告诉.NET这个类不要被序列化,当反序列化的时候SqlConnection就为null,例子如下:
<span class = "pun" >[</span><span class = "typ" >Serializable</span><span class = "pun" >]</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >MyClass</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > string </span><span class = "pln" > </span><span class = "typ" >Name</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > get </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > set </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > </span><span class = "typ" >Age</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > get </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > set </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >[</span><span class = "typ" >NonSerialized</span><span class = "pun" >]</span><span class = "pln" > </span><span class = "typ" >Work</span><span class = "pln" > myWork</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >Work</span><span class = "pln" > </span><span class = "typ" >MyWork</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > get </span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > myWork</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > set </span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > myWork </span><span class = "pun" >=</span><span class = "pln" > value</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >Work</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > string </span><span class = "pln" > </span><span class = "typ" >Name</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > set </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > get </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > string </span><span class = "pln" > </span><span class = "typ" >Address</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > set </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > get </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span> |
这样Work对像就不会被序列化到文件流中,当被反序列化时就MyWork属性就为null了。
序列化SOAP文件
要序列化成SOAP就要先用引用System.Runtime.Serialization.Formatters.Soap命名空间中的SoapFormatter类了。SoapFormatter是一个Soap的格式器
例子如下:
<span class = "pln" > </span><span class = "pun" >[</span><span class = "typ" >Serializable</span><span class = "pun" >]</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >MyClass</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > string </span><span class = "pln" > </span><span class = "typ" >Name</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > get </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > set </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > </span><span class = "typ" >Age</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > get </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > set </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >Work</span><span class = "pln" > </span><span class = "typ" >MyWork</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > get </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > set </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >[</span><span class = "typ" >Serializable</span><span class = "pun" >]</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >Work</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > string </span><span class = "pln" > </span><span class = "typ" >Name</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > set </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > get </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > string </span><span class = "pln" > </span><span class = "typ" >Address</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > set </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > get </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >Program</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > static </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > </span><span class = "typ" >Main</span><span class = "pun" >(</span><span class = "kwd" > string </span><span class = "pun" >[]</span><span class = "pln" > args</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >MyClass</span><span class = "pln" > </span><span class = "kwd" >my</span><span class = "pln" > </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >MyClass</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "kwd" >my</span><span class = "pun" >.</span><span class = "typ" >Name</span><span class = "pln" > </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "str" > "凤姐" </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" >my</span><span class = "pun" >.</span><span class = "typ" >Age</span><span class = "pln" > </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pun" >.</span><span class = "typ" >MaxValue</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "typ" >Work</span><span class = "pln" > work </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >Work</span><span class = "pun" >();</span><span class = "pln" > work</span><span class = "pun" >.</span><span class = "typ" >Address</span><span class = "pln" > </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "str" > "你家隔壁" </span><span class = "pun" >;</span><span class = "pln" > work</span><span class = "pun" >.</span><span class = "typ" >Name</span><span class = "pln" > </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "str" > "不知道" </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" >my</span><span class = "pun" >.</span><span class = "typ" >MyWork</span><span class = "pln" > </span><span class = "pun" >=</span><span class = "pln" > work</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "com" > //这里new 的是Soap格式的了</span><span class="pln"> </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "typ" >Runtime</span><span class = "pun" >.</span><span class = "typ" >Serialization</span><span class = "pun" >.</span><span class = "typ" >IFormatter</span><span class = "pln" > formatter </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >SoapFormatter</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "com" > //创建一个文件流</span><span class="pln"> </span><span class = "typ" >Stream</span><span class = "pln" > stream </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >FileStream</span><span class = "pun" >(@</span><span class = "str" > "c:\MyClass.xml" </span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >FileMode</span><span class = "pun" >.</span><span class = "typ" >Create</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >FileAccess</span><span class = "pun" >.</span><span class = "typ" >Write</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > using </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >stream</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "com" > //这里就是进行序列化了</span><span class="pln"> formatter</span><span class = "pun" >.</span><span class = "typ" >Serialize</span><span class = "pun" >(</span><span class = "pln" >stream</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" >my</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span> |
这样子就把”凤姐”这个对像序列成SOAP格式,生成到你的C盘里了(你可以郁闷下哇哈哈哈),文件内容如下
<span class="tag"><SOAP-ENV:Envelope</span><span class="pln"> </span><span class="atn">xmlns:xsi</span><span class="pun">=</span><span class="atv">"http://www.w3.org/2001/XMLSchema-instance"</span><span class="pln"> </span><span class="atn">xmlns:xsd</span><span class="pun">=</span><span class="atv">"http://www.w3.org/2001/XMLSchema"</span><span class="pln"> </span><span class="atn">xmlns:SOAP-ENC</span><span class="pun">=</span><span class="atv">"http://schemas.xmlsoap.org/soap/encoding/"</span><span class="pln"> </span><span class="atn">xmlns:SOAP-ENV</span><span class="pun">=</span><span class="atv">"http://schemas.xmlsoap.org/soap/envelope/"</span><span class="pln"> </span><span class="atn">xmlns:clr</span><span class="pun">=</span><span class="atv">"http://schemas.microsoft.com/soap/encoding/clr/1.0"</span><span class="pln"> </span><span class="atn">SOAP-ENV:encodingStyle</span><span class="pun">=</span><span class="atv">"http://schemas.xmlsoap.org/soap/encoding/"</span><span class="tag">></span><span class="pln"> </span><span class="tag"><SOAP-ENV:Body></span><span class="pln"> </span><span class="tag"><a1:MyClass</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"ref-1"</span><span class="pln"> </span><span class="atn">xmlns:a1</span><span class="pun">=</span><span class="atv">"http://schemas.microsoft.com/clr/nsassem/ConsoleApplication1/ConsoleApplication1%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull"</span><span class="tag">></span><span class="pln"> <_x003C_Name_x003E_k__BackingField id="ref-3">凤姐</_x003C_Name_x003E_k__BackingField> <_x003C_Age_x003E_k__BackingField>2147483647</_x003C_Age_x003E_k__BackingField> <_x003C_MyWork_x003E_k__BackingField href="#ref-4"/> </span><span class="tag"></a1:MyClass></span><span class="pln"> </span><span class="tag"><a1:Work</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"ref-4"</span><span class="pln"> </span><span class="atn">xmlns:a1</span><span class="pun">=</span><span class="atv">"http://schemas.microsoft.com/clr/nsassem/ConsoleApplication1/ConsoleApplication1%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull"</span><span class="tag">></span><span class="pln"> <_x003C_Name_x003E_k__BackingField id="ref-5">不知道</_x003C_Name_x003E_k__BackingField> <_x003C_Address_x003E_k__BackingField id="ref-6">你家隔壁</_x003C_Address_x003E_k__BackingField> </span><span class="tag"></a1:Work></span><span class="pln"> </span><span class="tag"></SOAP-ENV:Body></span><span class="pln"> </span><span class="tag"></SOAP-ENV:Envelope></span><span class="pln"> </span> |
SOAP格式的序列化文件就有一定的可读性了,这样就可以更好的跨平台的反序列化对像了。不过从速度上来说,当然还是二进制文件更快,可是二进制文件不好进行跨平台的反序列化,各有各的优点吧。
这节说完了,下节我们我该讲该如何用泛型格式器序列化对像。