再谈Silverlight中的对象序列化/反序列化
曾经发过一篇如何在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,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
{
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 + "nn反序列化后的结果: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 + "nn反序列化后的结果: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, 0, 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 + "nn反序列化后的结果: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方式处理对象序列化
[转载请注明来自"菩提树下的杨过"]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Angular Component之间的事件通知机制
- 如何将你的Python项目全面自动化?
- 正则表达式介绍与使用
- Angular ERROR NullInjectorError: R3InjectorError(AppModule)的错误分析
- 2.4-Air302(NB-IOT)-基础外设-延时,定时器
- Shell正则表达式一览表
- YAML基础语法
- 详解Kubernetes存储体系
- Python3 正则表达式特殊符号及用法.md
- Web网页响应式布局.md
- BootStrap应用开发学习入门1
- Python实现单链表和字典
- 关于如何做好运维管理工作的一点思考
- 2.6-Air302(NB-IOT)-基础外设-AD采集,NTC温度传感器B3950
- 2.5-Air302(NB-IOT)-基础外设-串口(485,422),CRC校验