.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.在默认情况 ...
随机推荐
- Unity3D脚本中文系列教程(十三)
http://dong2008hong.blog.163.com/blog/static/469688272014032334486/ Unity3D脚本中文系列教程(十二) ◆ function G ...
- [转载]Spring Bean Configuration Inheritance
转自: http://www.mkyong.com/spring/spring-bean-configuration-inheritance/ In Spring, the inheritance i ...
- 【leetcode】Combination Sum (middle)
Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ...
- 典型重构3 (Try/Catch)
Try/Catch 块过多 public Customer GetCustomer(string customerId) { try { var command = new SqlCommand(); ...
- mac 下周期调度命令或脚本
crontab 是在linux服务器上部署定时任务的方法 0 5 * * * /usr/bin/python /data/www/tools/mysql_backup.py cmd之前有5个项目要填, ...
- Tomcat部署问题,Tomcat集群部署问题。
1.服务器崩溃,指的是Tomcat程序崩溃,还是服务器系统崩溃? 答:都有可能. 所以一台服务器上部署多个Tomcat可以防止程序崩溃问题.但不能避免服务器崩溃,要避免服务器崩溃,就要采用服务器集群. ...
- iOS开发网络篇--NSURLConnection
S简介 NSURLConnection: 作用: 1.负责发送请求,建立客户端和服务器的连接发送数据给服务器 2.并收集来自服务器的响应数据 步骤: 1.创建一个NSURL对象,设置请求路径 2.传入 ...
- PCL—低层次视觉—点云分割(基于形态学)
1.航空测量与点云的形态学 航空测量是对地形地貌进行测量的一种高效手段.生成地形三维形貌一直是地球学,测量学的研究重点.但对于城市,森林,等独特地形来说,航空测量会受到影响.因为土地表面的树,地面上的 ...
- linux系统的文件类型学习
linux是一个文件型操作系统,在linux下一切皆文件. 目录.字符设备.块设备.管道.套接字.符号连接文件等在linux下统统都是文件. linux下的文件类型分为以下几种类型: 1. 正规文件, ...
- js判断浏览器类型 js判断ie6不执行
js判断浏览器类型 $.browser 对象 $.browser.version 浏览器版本 var binfo = ''; if ($.browser.msie) { binfo = " ...