再談Silverlight中的物件序列化 反序列化

2022-01-31 16:43:33 字數 4054 閱讀 2001

曾經發過一篇如何在silveright中利用xmlserializer序列化物件的文章「silverlight中的序列化」,限於當時的認識有限,一度以為silverlight只有這一種辦法,今天意外發現,其實還有更好的方式,特此做乙個彙總與比較

1.json序列化方式

silverlight支援json字串已是眾人皆知的事情,沒啥好說的,有點容易讓人誤導的是:我們在vs的silverlight專案中新增引用時,一眼就能看到system.runtime.serialization.json這個命名空間,於是想當然的以為json序列化的功能肯定是在這個命名空間下面

結果等你搗鼓半天才發現,其實這下面跟序列化相關的東西,啥也沒有?

可能有朋友注意到了,在最新的.net4.0中,這個命名空間下貌似有json序列化功能了,但在sl4.0正式發布前,sl3.0(及以下版本)還是沒辦法玩的,其實silverlight3.0中是可以json序列化物件的,正確的程式集在system.servicemodel.web這個下面,所以只要新增system.servicemodel.web引用即可(**見本文最後)

另外codeplex開源專案上也有乙個json的開源專案  同樣可用於silverlight的序列化

2.xmlserializer序列化方式

這個在上篇文章裡已經講過了,不再重複

3.datacontractserializer序列化方式

這個在命名空間system.runtime.serialization下

下面演示了三種方式的物件序列化與反序列化,值得一提的是:silverlight中不管用哪一種方式序列化,物件的類定義中都無需新增[datacontract],[datamember],[serializeable]之類的標記--前提是物件成員都是string,int之類的基本型別!

silverlight演示:

xaml部分**:

<

usercontrol 

x:class

="slserialize.mainpage"

xmlns

=""xmlns:x

=""xmlns:d

=""xmlns:mc

=""mc:ignorable

="d"

d:designheight

="300"

d:designwidth

="400"

>

<

grid 

x:name

="layoutroot"

background

="white"

>

<

grid.rowdefinitions

>

<

rowdefinition

>

rowdefinition

>

<

rowdefinition 

height

="30"

>

rowdefinition

>

grid.rowdefinitions

>

<

textbox 

x:name

="txtresult"

grid.row

="0"

horizontalalignment

="stretch"

verticalalignment

="stretch"

="wrap"

>

textbox

>

<

stackpanel 

orientation

="horizontal"

grid.row

="1"

horizontalalignment

="center"

verticalalignment

="center"

height

="23"

>

<

button 

content

="json序列化"

name

="btnjson"

click

="btnjson_click"

/>

<

button 

content

="xml序列化"

name

="btnxml"

click

="btnxml_click"

margin

="5,0,0,0"

/>

<

button 

content

="二進位制序列化"

name

="btnbin"

click

="btnbin_click"

margin

="5,0,0,0"

/>

stackpanel

>

grid

>

usercontrol

>

cs部分**:

using

system.io;

using

system.json;

using

system.runtime.serialization;

using

system.runtime.serialization.json;

using

system.text;

using

system.windows;

using

system.windows.controls;

using

system.xml.serialization;

namespace

slserialize

void

mainpage_loaded(

object

sender, routedeventargs e);}

private

void

btnjson_click(

object

sender, routedeventargs e);//

顯示結果

txtresult.text ="

json序列化後的字串:(長度"+

jsonstring.length +"

)\n"

+jsonstring +"

\n\n反序列化後的結果:\nage="+

ptest.age +"

,name="+

ptest.name;

}private

void

btnxml_click(

object

sender, routedeventargs e)

private

void

btnbin_click(

object

sender, routedeventargs e)

}///

///測試類

///public

class

person

public

intage }}

最後比較一下各自的異同:

可以看到,如果:

用json方式序列化以及反序列化,最終會引入50k的"system.json.dll",序列化後的位元組數最少;

xmlserializer方式,最終會引入314k的"system.xml.serialization.dll",序列化後的位元組數也最多;

datacontractserializer方式,預設不需引用額外的程式集,序列化後的位元組數高於json方式,但低於xmlserializer方式

建議:

Silverlight中的DataGrid繫結資料

首先寫乙個類 public class employee public string lastname public decimal salary public datetime startdate public bool isvested public string gender 接著再寫乙個類,...

Silverlight中的DataGrid繫結資料

首先寫乙個類 public class employee public string lastname public decimal salary public datetime startdate public bool isvested public string gender 接著再寫乙個類,...

Silverlight中的DataGrid繫結資料

首先寫乙個類 public class employee public string lastname public decimal salary public datetime startdate public bool isvested public string gender 接著再寫乙個類,...