再谈Silverlight中的对象序列化/反序列化

简介: 曾经发过一篇如何在Silveright中利用XmlSerializer序列化对象的文章“Silverlight中的序列化”,限于当时的认识有限,一度以为silverlight只有这一种办法,今天意外发现,其实还有更好的方式,特此做一个汇总与比较 1.

曾经发过一篇如何在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  +   " \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,  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  +   " \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方式处理对象序列化

 

[转载请注明来自"菩提树下的杨过"]

目录
相关文章
|
1月前
|
缓存 安全 PHP
PHP中的魔术方法与对象序列化
本文将深入探讨PHP中的魔术方法,特别是与对象序列化和反序列化相关的__sleep()和__wakeup()方法。通过实例解析,帮助读者理解如何在实际应用中有效利用这些魔术方法,提高开发效率和代码质量。
|
3天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
13天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
16天前
|
JSON 前端开发 数据格式
前端的全栈之路Meteor篇(五):自定义对象序列化的EJSON介绍 - 跨设备的对象传输
EJSON是Meteor框架中扩展了标准JSON的库,支持更多数据类型如`Date`、`Binary`等。它提供了序列化和反序列化功能,使客户端和服务器之间的复杂数据传输更加便捷高效。EJSON还支持自定义对象的定义和传输,通过`EJSON.addType`注册自定义类型,确保数据在两端无缝传递。
|
27天前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
|
1月前
|
JSON 缓存 NoSQL
Redis 在线查看序列化对象技术详解
Redis 在线查看序列化对象技术详解
33 2
|
13天前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
10 0
|
2月前
|
存储 XML JSON
用示例说明序列化和反序列化
用示例说明序列化和反序列化
|
2月前
|
JSON 安全 编译器
扩展类实例的序列化和反序列化
扩展类实例的序列化和反序列化
31 0
下一篇
无影云桌面