曾经发过一篇如何在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的开源项目 http://json.codeplex.com/ 同样可用于Silverlight的序列化
2.XmlSerializer序列化方式
这个在上篇文章里已经讲过了,不再重复
3.DataContractSerializer序列化方式
这个在命名空间System.Runtime.Serialization下
下面演示了三种方式的对象序列化与反序列化,值得一提的是:silverlight中不管用哪一种方式序列化,对象的类定义中都无需添加[DataContract],[DataMember],[Serializeable]之类的标记--前提是对象成员都是string,int之类的基本类型!
silverlight演示:
XAML部分代码:
< UserControl x:Class ="SlSerialize.MainPage"xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d ="http://schemas.microsoft.com/Expression/blend/2008"
xmlns:mc ="http://schemas.openxmlformats.org/markup-compatibility/2006"
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" textwrapPing ="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" />
< button Content ="二进制序列化" name ="btnBin" Click ="btnBin_Click" margin ="5,0" />
</ StackPanel >
</ GrID >
</ UserControl >
CS部分代码:
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
{
public partial class MainPage : UserControl
{
Person _person;
public MainPage()
{
InitializeComponent();
this .Loaded += new RoutedEventHandler(MainPage_Loaded);
}
voID MainPage_Loaded( object sender, RoutedEventArgs e)
{
_person = new Person() { name = " 菩提树下的/ " 杨过/ "" , Age = 30 };
}
private voID btnjson_Click( object sender, RoutedEventArgs e)
{
// Json序列化开始
MemoryStream ms = new MemoryStream();
DataContractJsonSerializer ser = new DataContractJsonSerializer( typeof (Person));
ser.WriteObject(ms, _person);
byte [] Json = ms.ToArray();
ms.Close();
string JsonString = EnCoding.UTF8.GetString(Json, 0 , Json.Length); // 序列化得到的字符串
// Json字符串解析(相当于反序列化)
JsonValue Jsonv = JsonObject.Parse(JsonString);
Person pTest = new Person() { Age = int .Parse(Jsonv[ " Age " ].ToString()), name = Jsonv[ " name " ].ToString() };
// 显示结果
txtResult.Text = " Json序列化后的字符串:(长度 " + JsonString.Length + " )/n " + JsonString + " /n/n反序列化后的结果:/nAge= " + pTest.Age + " ,name= " + pTest.name;
}
private voID btnXml_Click( object sender, RoutedEventArgs e)
{
// xml序列化开始
MemoryStream ms = new MemoryStream();
XmlSerializer xml = new XmlSerializer( typeof (Person));
xml.Serialize(ms, _person); // xml序列化的关键代码
byte [] arr = ms.ToArray();
ms.Close();
string xmlString = EnCoding.UTF8.GetString(arr, 0 ,arr.Length);
ms.Close();
// xml反序列化
MemoryStream ms2 = new MemoryStream(EnCoding.UTF8.GetBytes(xmlString));
XmlSerializer xml2 = new XmlSerializer( typeof (Person));
Person pTest = xml.Deserialize(ms2) as Person; // xml反序列化的关键代码
ms2.Close();
// 显示反序列化后的结果
txtResult.Text = " xml序列化后的字符串:(长度 " + xmlString.Length + " )/n " + xmlString + " /n/n反序列化后的结果:/nAge= " + pTest.Age + " ,name= " + pTest.name;
}
private voID btnBin_Click( object sender, RoutedEventArgs e)
{
// DataContract方式序列化
MemoryStream ms = new MemoryStream();
DataContractSerializer ser = new DataContractSerializer( typeof (Person));
ser.WriteObject(ms, _person);
byte [] array = ms.ToArray();
ms.Close();
string _serializeString = EnCoding.UTF8.GetString(array, array.Length);
// 反序列化
DataContractSerializer ser2 = new DataContractSerializer( typeof (Person));
MemoryStream ms2 = new MemoryStream(EnCoding.UTF8.GetBytes(_serializeString));
Person pTest = ser2.Readobject(ms2) as Person;
// 显示反序列化后的结果
txtResult.Text = " DataContract序列化后的字符串:(长度 " + _serializeString.Length + " )/n " + _serializeString + " /n/n反序列化后的结果:/nAge= " + pTest.Age + " ,name= " + pTest.name;
}
}
/// <summary>
/// 测试类
/// </summary>
public class Person
{
public string name { set ; get ; }
public int Age { set ; get ; }
}
}
最后比较一下各自的异同:
可以看到,如果:
用Json方式序列化以及反序列化,最终会引入50k的"System.Json.dll",序列化后的字节数最少;
XmlSerializer方式,最终会引入314k的"System.Xml.Serialization.dll",序列化后的字节数也最多;
DataContractSerializer方式,默认不需引用额外的程序集,序列化后的字节数高于Json方式,但低于XmlSerializer方式
建议:
如果在网络通讯应用(比如socket编程中),最好使用Json方式序列化;
如果想让最终的xap体积最小(以达到最快加载速度),最好使用DataContractSerializer方式;
一般不建议使用XmlSerializer方式处理对象序列化
[转载请注明来自"菩提树下的杨过"]
作者: 菩提树下的杨过出处: http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 Tag标签: silverlight,序列化,反序列化 总结
以上是内存溢出为你收集整理的再谈Silverlight中的对象序列化/反序列化全部内容,希望文章能够帮你解决再谈Silverlight中的对象序列化/反序列化所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)