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

序列化和反序列化

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

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

那么.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. Unity GameObject.activeSelf, GameObject.activeInHierarchy,GameObject.SetActive和SetActiveRecursively

    activeSelf(read only只读):物体本身的active状态,对应于其在inspector中的checkbox是否被勾选activeInHierarchy(read only只读):物体 ...

  2. 如何使用工具进行线上 PHP 性能追踪及分析?

    工作了一两年的 PHPer 大概都多多少少知道一些性能分析的工具,比如 Xdebug.xhprof.New Relic .OneAPM.使用基于 Xdebug 进行 PHP 的性能分析,对于本地开发环 ...

  3. C# 面向对象之概念理解(3)

    多态 多态是指两个或多个属于不同类的对象,对同一个消息(方法调用)做出不同响应的能力. 多态(<韦氏大词典>)中定义:可以呈现不同形式的能力或状态. C#如何实现多态的知识——即继承上覆载 ...

  4. hdu 1905 小数化分数2

    ;}

  5. Eclipse 编译错误 Access restriction:The type *** is not accessible due to restriction on... 解决方案

    报错: Access restriction:The type JPEGCodec is not accessible due to restriction on required library C ...

  6. lintcode :Integer to Roman 整数转罗马数字

    题目 整数转罗马数字 给定一个整数,将其转换成罗马数字. 返回的结果要求在1-3999的范围内. 样例 4 -> IV 12 -> XII 21 -> XXI 99 -> XC ...

  7. 被忽略却很有用的html标签

    <base>标签  作用:标签为页面中所有链接指定默认链接地址或链接目标.有时候我们需要让首页的链接全部在新窗口中打开,我们一般会这样写链接,而使用这个标签就能一下搞定了! 属性:Href ...

  8. 【mongoDB高级篇②】大数据聚集运算之mapReduce(映射化简)

    简述 mapReduce从字面上来理解就是两个过程:map映射以及reduce化简.是一种比较先进的大数据处理方法,其难度不高,从性能上来说属于比较暴力的(通过N台服务器同时来计算),但相较于grou ...

  9. spring autoWire注解和@resource注解区别

    1.autoWire注解主要是按类型匹配.因为autowire的扫描机制,是按照接口类型来扫描bean的. 而JSR250 @resource注解是通过名称扫描注入的. @autowire注解的扫描方 ...

  10. UNIX相关知识

    UNIX UNIX的设计目标是小而美:希望能在任何小系统上执行,而核心只提供必不可少的一些功能,其他的则根据需要加上去.这已经成为操作系统的一种设计哲学. The Open Group持有UNIX商标 ...