我们知道将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本这正是数据持久化所要做的。而且,不同应用程序之间的通讯需要相互传输数据。那么序列化和反序列化正是为此而生。

序列化和反序列化

所谓序列化就是把对象转换为字节序列的过程称为对象的序列化。

所谓反序列化就是字节序列恢复为对象的过程称为对象的反序列化

那么.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中的各种序列化的更多相关文章

  1. 【译】Java中的对象序列化

    前言 好久没翻译simple java了,睡前来一篇. 译文链接: http://www.programcreek.com/2014/01/java-serialization/ 什么是对象序列化 在 ...

  2. Asp.net中Json的序列化和反序列化(一)

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...

  3. protobuf-net 与 C#中几种序列化的比较

    C#中几种序列化的比较,此次比较只是比较了 序列化的耗时和序列后文件的大小. 几种序列化分别是: 1. XmlSerializer 2. BinaryFormatter 3. DataContract ...

  4. ASP.NET中JSON的序列化和反序列化

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介 ...

  5. 在Spark中使用Kryo序列化

    spark序列化  对于优化<网络性能>极为重要,将RDD以序列化格式来保存减少内存占用. spark.serializer=org.apache.spark.serializer.Jav ...

  6. C#[Serializable]在C#中的作用-NET 中的对象序列化

    为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本:按值将对象从一个应用程序域发送至另一个应用程序域.例如,序列化可用于在 ASP.NET 中保 ...

  7. ASP.NET 中JSON 的序列化和反序列化

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...

  8. Asp.Net中JSON的序列化和反序列化-----JavaScriptSerializer ,加上自己工作心得

    在工作中和手机通信用到web服务和javascriptSerializer,返回json数据,供手机端调用,一开始返回的数据是一大堆,比如 [{"word_picture9":&q ...

  9. ASP.NET中JSON的序列化和反序列化(转)

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...

  10. 在Spark中自定义Kryo序列化输入输出API(转)

    原文链接:在Spark中自定义Kryo序列化输入输出API 在Spark中内置支持两种系列化格式:(1).Java serialization:(2).Kryo serialization.在默认情况 ...

随机推荐

  1. PV操作,

    P操作是先做减一操作,然后判读是否大于等于0. V操作是先做加一操作,然后判断是否大于0

  2. 写一个函数,实现两个字符串的比较。即实现strcmp函数,s1=s2时返回0,s1!=s2时返回二者第一个不同字符的ASCII值。

    #include<stdio.h> #include<stdlib.h> int main(){ setvbuf(stdout,NULL,_IONBF,); ],s2[]; i ...

  3. Linux显示中文乱码解决方法

    vi /etc/sysconfig/i18n 将内容改为 LANG="zh_CN.GB18030" LANGUAGE="zh_CN.GB18030:zh_CN.GB231 ...

  4. hdu 2717 Catch That Cow(BFS,剪枝)

    题目 #include<stdio.h> #include<string.h> #include<queue> #include<algorithm> ...

  5. POJ 3125 Printer Queue(队列,水题)

    题意:有多组数据,每组数据给出n,m,n表示需要打印的文件个数,m表示要打印的目标位置(m为0~n-1).    接下来给出n个数,第i个值对应第i-1个位置的优先级大小.    打印规则如下:    ...

  6. hdu 4038 Stone

    思路: 如果负数的个数为偶数则不必改变,为奇数就将最大负数变为正: 对于正数,尽量将1,2变为3即可. 代码如下: #include<cstring> #include<iostre ...

  7. lintcode 中等题:subSets 子集

    题目 子集 给定一个含不同整数的集合,返回其所有的子集 样例 如果 S = [1,2,3],有如下的解: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], ...

  8. PostMessage与SendMessage各自的问题

     深入解析SendMessage.PostMessage 本文将使用C++语言,在MFC框架的配合下给出PostMessage.SendMessage等的使用方式与使用不当造成的后果(讨论均针对自定义 ...

  9. 一个不错的log4j.properties例子

    # Set root logger level to WARN and append to stdout #在开发环境下日志级别要设置成DEBUG,生产环境设置成info或error log4j.ro ...

  10. 63. Unique Paths II

    题目: Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. H ...