.Net中的各种序列化
我们知道将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本这正是数据持久化所要做的。而且,不同应用程序之间的通讯需要相互传输数据。那么序列化和反序列化正是为此而生。
序列化和反序列化
所谓序列化就是把对象转换为字节序列的过程称为对象的序列化。
所谓反序列化就是字节序列恢复为对象的过程称为对象的反序列化
那么.net开发中都为我们提供了哪些序列化和反序列化的方式呢?我简单总结了一下,有以下几种:
1.位于System.Xml.Serialization命名空间下的XmlSerializer
2.位于System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter
3.位于System.Runtime.Serialization.Formatters.Binary;命名空间下的BinaryFormatter
4.位于System.Web.Script.Serialization命名空间下的JavaScriptSerializer
5.位于System.Runtime.Serialization.Json命名空间下的DataContractJsonSerializer、DataContractSerializer
6.位于System.Runtime.Serialization命名空间下的NetDataContractSerializer
7.来自第三方的Newtonsoft.Json
那么我简单地写了个序列化帮助类。完整代码如下(它们都有各自的使用场合,用法也不止如此):
namespace Serialization
{
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Web.Script.Serialization;
using System.Xml.Serialization;
using Newtonsoft.Json;
public class SerializeHelper
{
#region XmlSerializer
public static void XmlSerialize(string fileName, object obj)
{
using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Write))
{
try
{
XmlSerializer serializer = new XmlSerializer(obj.GetType());
serializer.Serialize(fs, obj);
}
catch (Exception e)
{
throw e;
}
}
} public static T XmlDeSerialize<T>(string fileName) where T : class,new()
{
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
try
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
return serializer.Deserialize(fs) as T;
}
catch (Exception e)
{
throw e;
}
}
}
#endregion #region SoapFormatter
//不支持泛型 所序列化的类型必须标志为Serializable
public static void SoapSerialize(string fileName, object obj)
{
using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Write))
{
try
{
SoapFormatter formatter = new SoapFormatter();
formatter.Serialize(fs, obj);
}
catch (Exception e)
{
throw e;
}
}
} public static T SoapDeSerialize<T>(string fileName) where T : class, new()
{
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
try
{
SoapFormatter formatter = new SoapFormatter();
return formatter.Deserialize(fs) as T;
}
catch (Exception e)
{
throw e;
}
}
}
#endregion #region BinaryFormatter
//所序列化的类型必须标志为Serializable
public static void BinarySerialize(string fileName, object obj)
{
using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Write))
{
try
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, obj);
}
catch (Exception e)
{
throw e;
}
}
} public static T BinaryDeSerialize<T>(string fileName) where T : class, new()
{
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
try
{
BinaryFormatter formatter = new BinaryFormatter();
return formatter.Deserialize(fs) as T;
}
catch (Exception e)
{
throw e;
}
}
}
#endregion #region JavaScriptSerializer
public static string JavaScriptSerialize(object obj)
{
JavaScriptSerializer serizlizer = new JavaScriptSerializer();
return serizlizer.Serialize(obj);
} public static T JavaScriptDeSerialize<T>(string json) where T : class, new()
{
JavaScriptSerializer serizlizer = new JavaScriptSerializer();
return serizlizer.Deserialize<T>(json);
}
#endregion #region DataContractJsonSerializer
/// <summary>
/// (DataContractJsonSerialize)序列化
/// </summary>
/// <param name="item">对象</param>
public static string DataContractJsonSerialize(object obj)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, obj);
return Encoding.UTF8.GetString(ms.ToArray());
}
} /// <summary>
/// (DataContractJsonSerialize)反序列化
/// </summary>
/// <param name="str">字符串序列</param>
public static T DataContractJsonDeSerialize<T>(string str) where T : class,new()
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(str)))
{
return serializer.ReadObject(ms) as T;
}
}
#endregion #region NetDataContractSerializer
public static void NetDataContractSerialize(string fileName, object obj)
{
using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Write))
{
try
{
NetDataContractSerializer serializer = new NetDataContractSerializer();
serializer.Serialize(fs, obj);
}
catch (Exception e)
{
throw e;
}
}
} public static T NetDataContractDeSerialize<T>(string fileName) where T : class,new()
{
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
try
{
NetDataContractSerializer serializer = new NetDataContractSerializer();
return serializer.Deserialize(fs) as T;
}
catch (Exception e)
{
throw e;
}
}
}
#endregion #region DataContractSerializer
public static void DataContractSerialize(string fileName, object obj)
{
using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Write))
{
try
{
DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
serializer.WriteObject(fs, obj);
}
catch (Exception e)
{
throw e;
}
}
} public static T DataContractDeSerialize<T>(string fileName) where T : class,new()
{
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
try
{
DataContractSerializer serializer = new DataContractSerializer(typeof(T));
return serializer.ReadObject(fs) as T;
}
catch (Exception e)
{
throw e;
}
}
}
#endregion #region Newtonsoft
public static string JsonConvertSerialize(object item)
{
return JsonConvert.SerializeObject(item);
} public static T JsonDeSerialize<T>(string json) where T : class,new()
{
return JsonConvert.DeserializeObject<T>(json);
}
#endregion
}
}
关于各种序列化的各自"用武之地"以及总体性能比较,有空再细细深究。
.Net中的各种序列化的更多相关文章
- 【译】Java中的对象序列化
前言 好久没翻译simple java了,睡前来一篇. 译文链接: http://www.programcreek.com/2014/01/java-serialization/ 什么是对象序列化 在 ...
- Asp.net中Json的序列化和反序列化(一)
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...
- protobuf-net 与 C#中几种序列化的比较
C#中几种序列化的比较,此次比较只是比较了 序列化的耗时和序列后文件的大小. 几种序列化分别是: 1. XmlSerializer 2. BinaryFormatter 3. DataContract ...
- ASP.NET中JSON的序列化和反序列化
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介 ...
- 在Spark中使用Kryo序列化
spark序列化 对于优化<网络性能>极为重要,将RDD以序列化格式来保存减少内存占用. spark.serializer=org.apache.spark.serializer.Jav ...
- C#[Serializable]在C#中的作用-NET 中的对象序列化
为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本:按值将对象从一个应用程序域发送至另一个应用程序域.例如,序列化可用于在 ASP.NET 中保 ...
- ASP.NET 中JSON 的序列化和反序列化
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...
- Asp.Net中JSON的序列化和反序列化-----JavaScriptSerializer ,加上自己工作心得
在工作中和手机通信用到web服务和javascriptSerializer,返回json数据,供手机端调用,一开始返回的数据是一大堆,比如 [{"word_picture9":&q ...
- ASP.NET中JSON的序列化和反序列化(转)
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...
- 在Spark中自定义Kryo序列化输入输出API(转)
原文链接:在Spark中自定义Kryo序列化输入输出API 在Spark中内置支持两种系列化格式:(1).Java serialization:(2).Kryo serialization.在默认情况 ...
随机推荐
- NYOJ-44 子串和 AC 分类: NYOJ 2014-01-04 22:53 154人阅读 评论(0) 收藏
作为菜鸟一枚,对子串和的代码完全就是硬算 的..结果是TLE #include<stdio.h> int jh(int x,int y,int num[],int sum[]); int ...
- Consumer Client Re-Design (翻译)
注:0.9版本Kafka的一个重大改变就是consumer和producer API的重新设计. 这篇Kafka的文档大致介绍了对于consumer API重新设计时想要实现的功能.0.9版本的确实现 ...
- Unity3D脚本中文系列教程(十三)
http://dong2008hong.blog.163.com/blog/static/469688272014032334486/ Unity3D脚本中文系列教程(十二) ◆ function G ...
- POJ 3258
River Hopscotch Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5961 Accepted: 2579 D ...
- 内存对齐-C语言struct内存占用问题
转1个写的比较全面的. http://hubingforever.blog.163.com/blog/static/17104057920122256134681/ 本文编辑整理自:http://hi ...
- c# 组元(Tuple)
组元是C# 4.0引入的一个新特性,编写的时候需要基于.NET Framework 4.0或者更高版本.组元使用泛型来简化一个类的定义. 先以下面的一段代码为例子: public class Poin ...
- Intellij 导入play framework 项目
新建一个项目 play new helloworld IshallbeThatIshallbe:~ iamthat$ mkdir temp IshallbeThatIshallbe:~ iamthat ...
- lintcode:previous permutation上一个排列
题目 上一个排列 给定一个整数数组来表示排列,找出其上一个排列. 样例 给出排列[1,3,2,3],其上一个排列是[1,2,3,3] 给出排列[1,2,3,4],其上一个排列是[4,3,2,1] 注意 ...
- lintcode 中等题:partition array 数组划分
题目 数组划分 给出一个整数数组nums和一个整数k.划分数组(即移动数组nums中的元素),使得: 所有小于k的元素移到左边 所有大于等于k的元素移到右边 返回数组划分的位置,即数组中第一个位置i, ...
- 入门视频采集与处理(BT656简介)
入门视频采集与处理(BT656简介) http://ticktick.blog.51cto.com/823160/553535 1. 帧的概念(Frame) 一个视频序列是由N个帧组成的,采集图像的 ...