C#中几种序列化的比较,此次比较只是比较了 序列化的耗时和序列后文件的大小。

几种序列化分别是:

1. XmlSerializer

2. BinaryFormatter

3. DataContractSerializer

4. DataContractJsonSerializer

5. protobuf-net

前四种为.Net 自带的类库,最后一种为 Google Protocol Buffers

首先,选做一个实体类,做为序列化的对象,加入了一个可序列化的字典,让实体类 稍稍的复杂一点。

Code:

    [Serializable]
[ProtoContract]
public class User
{
[ProtoMember()]
public int ID { get; set; }
[ProtoMember()]
public string Name { get; set; }
[ProtoMember()]
public int Age { get; set; }
[ProtoMember()]
public SerializableDictionary<Guid, Guid> Dictionary { get; set; }
} [Serializable]
public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable
{
public void WriteXml(XmlWriter write) // Serializer
{
var keySerializer = new XmlSerializer(typeof(TKey));
var valueSerializer = new XmlSerializer(typeof(TValue)); foreach (KeyValuePair<TKey, TValue> kv in this)
{
write.WriteStartElement("SerializableDictionary");
write.WriteStartElement("key");
keySerializer.Serialize(write, kv.Key);
write.WriteEndElement();
write.WriteStartElement("value");
valueSerializer.Serialize(write, kv.Value);
write.WriteEndElement();
write.WriteEndElement();
}
}
public void ReadXml(XmlReader reader) // Deserializer
{
reader.Read();
var keySerializer = new XmlSerializer(typeof(TKey));
var valueSerializer = new XmlSerializer(typeof(TValue)); while (reader.NodeType != XmlNodeType.EndElement)
{
reader.ReadStartElement("SerializableDictionary");
reader.ReadStartElement("key");
TKey tk = (TKey)keySerializer.Deserialize(reader);
reader.ReadEndElement();
reader.ReadStartElement("value");
TValue vl = (TValue)valueSerializer.Deserialize(reader);
reader.ReadEndElement();
reader.ReadEndElement();
this.Add(tk, vl);
reader.MoveToContent();
}
reader.ReadEndElement();
}
public XmlSchema GetSchema()
{
return null;
}
}

然后,初始化一个集合,有1000个User对象,每个User对象中的字典,有500对Guid

            var list = new List<User>();

            var random = new Random();

            for (int i = ; i < ; i++)
{
var id = random.Next(, );
var user = new User
{
ID = id,
Name = "Name" + id,
Age = random.Next(, )
}; var dic = new SerializableDictionary<Guid, Guid>();
for (int j = ; j < ; j++)
{
dic.Add(Guid.NewGuid(), Guid.NewGuid());
} user.Dictionary = dic; list.Add(user);
}

最后,开始序列化,计时用 Stopwatch

1. Xml序列化

            Stopwatch sw = new Stopwatch();

            //XmlSerializer
sw.Start();
var xmlSerializer = new XmlSerializer(typeof(List<User>));
const string xmlfile = "xml.txt"; var fi = new FileInfo(xmlfile);
using (var stream = fi.Create())
{
xmlSerializer.Serialize(stream, list);
}
sw.Stop(); fi.Refresh();
Console.WriteLine("XML Time : {0} , Size : {1}K", sw.Elapsed, fi.Length / );

2. 二进制序列化

            //BinarySerializer
sw.Restart();
var binarySerializer = new BinaryFormatter(); const string binaryfile = "binary.txt"; var binaryfi = new FileInfo(binaryfile);
using (var stream = binaryfi.Create())
{
binarySerializer.Serialize(stream, list);
} sw.Stop();
binaryfi.Refresh();
Console.WriteLine("Binary Time : {0} , Size : {1}K", sw.Elapsed, binaryfi.Length / );

3. DataContractSerializer

            //DataContractSerializer
sw.Restart();
var dataContractSerializer = new DataContractSerializer(typeof(List<User>)); const string dataContractfile = "dataContract.txt"; var dataContractfi = new FileInfo(dataContractfile);
using (var stream = dataContractfi.Create())
{
dataContractSerializer.WriteObject(stream, list);
} sw.Stop(); fi.Refresh();
Console.WriteLine("DataContrac Time : {0} , Size : {1}K", sw.Elapsed, dataContractfi.Length / );

4. DataContractJsonSerializer

            //DataContractJsonSerializer
sw.Restart();
var dataContractJsonSerializer = new DataContractJsonSerializer(typeof(List<User>)); const string dataContractJsonfile = "dataContractJson.txt"; var dataContractJsonfi = new FileInfo(dataContractJsonfile);
using (var stream = dataContractJsonfi.Create())
{
dataContractJsonSerializer.WriteObject(stream, list);
} sw.Stop(); fi.Refresh();
Console.WriteLine("DataContractJson Time : {0} , Size : {1}K", sw.Elapsed, dataContractJsonfi.Length / );

5. protobuf-net

            sw.Restart();
//protobuf-net
const string protobuffile = "buffer.txt";
var pbfi = new FileInfo(protobuffile);
using (var stream = pbfi.Create())
{
Serializer.Serialize(stream, list);
}
sw.Stop(); fi.Refresh();
Console.WriteLine("Protobuf-net Time : {0} , Size : {1}K", sw.Elapsed, pbfi.Length / );

我连续,测了N次,只贴上3次的结果吧:

看这个结果,Protobuf-net 无论序列化速度,还是序列化的体积都完胜其他几种。

此测试只是个人无聊而为,如果有不合理的地方,请大家指出来。

protobuf-net 与 C#中几种序列化的比较的更多相关文章

  1. 关于Django中,实现序列化的几种不同方法

    前言 关于序列化操作,就是将一个可迭代的数据结构,通过便利的方式进行我们所需要的操作. 今天历来归纳一下,Django中的几种不同得分方法,已经Django-restframework提供的方法 创建 ...

  2. 十五天精通WCF——第十二天 说说wcf中的那几种序列化

    我们都知道wcf是由信道栈组成的,在我们传输的参数走到传输信道层之前,先需要经过序列化的过程,也就是将参数序列化为message,这篇 我们就来说说这里的序列化,蛮有意思的,可能初学者也明白,在wcf ...

  3. [转]十五天精通WCF——第十二天 说说wcf中的那几种序列化

    我们都知道wcf是由信道栈组成的,在我们传输的参数走到传输信道层之前,先需要经过序列化的过程,也就是将参数序列化为message,这篇 我们就来说说这里的序列化,蛮有意思的,可能初学者也明白,在wcf ...

  4. PHP四种序列化方案

    原文地址:https://t.ti-node.com/thread/... 数据的序列化是一个非常有用的功能,然而目测很多人跟我一样,在刚接触这玩意的时候压根就不理解这货色到底是干啥用的,反正老师说了 ...

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

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

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

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

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

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

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

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

  9. asp.net中对象的序列化,方便网络传输

    对象序列化 是将对象状态转换为可保持或传输的格式的过程.反序列化 是将流转换为对象序列化和反序列化相结合 可以使对象数据轻松的存储和传递 在 .NET 中,如果是对象可序列化,需要在 声明对象的开始部 ...

随机推荐

  1. Maven学习总结(二)——Maven项目构建过程练习

    上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项目的过程 一.创建Maven项目 1.1.建立Hello项目 1.首先建立Hello项目,同时建立M ...

  2. LR工具使用之场景设置

    LR工具使用之场景设置 一.操作步骤 1.运行loadrunner,进入运行负载测试控件:

  3. JSONCPP安装

    我刚刚开始从windows MFC下的开发转的LINUX下的C++开发.在写这篇文章之前我三次安装jsoncpp,每一次安装都犯不同的错误.为了我能够在下一次安装时不再犯错误.特写此文!JSONCPP ...

  4. Linux 文件锁

    当多个进程同时访问操作同一个文件时,我们怎么保证文件数据的正确性. linux通常采用的方法是文件上锁,来避免共享资源的产生竞争状态. 文件锁包括建议性锁和强制性的锁: 建议性的锁 :顾名思义,相对温 ...

  5. [转]df命令

    linux中df命令参数功能:检查文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 语法:df [选项] 该命令各个选项的含义如下: -a 显示所有文件 ...

  6. CLR VIA C#事件

    事件是类型的一个成员,用来在事情发生的时候通知注册了该事件的成员. 事件和观察者模式十分的相似,所以事件应该提供如下几种能力 1.能让对象的方法登记对他的关注 2.能让对象的方法取消对他的关注 3.能 ...

  7. C语言课设心得分享(一)

    今儿上完课设,老师果然讲的比较少,周四还不用去,看来还是学生自己折腾.我在做课设的过程中,攒了一些心得/体会,希望能和大家分享分享,也希望能一起探讨探讨.如果是我能回答的问题,我很乐意能够提供帮助. ...

  8. 【BZOJ2595】游览计划(状压DP,斯坦纳树)

    题意:见题面(我发现自己真是越来越懒了) 有N*M的矩阵,每个格子有一个值a[i,j] 现要求将其中的K个点(称为关键点)用格子连接起来,取(i,j)的费用就是a[i,j] 求K点全部连通的最小花费以 ...

  9. color 和 mode

    ------siwuxie095 color 设置默认的控制台前景和背景的颜色 语法:COLOR [attr] attr  用于指定控制台输出的颜色属性,此属性由两个十六进制数字指定, 第一个为背景颜 ...

  10. 图解 & 深入浅出 JavaWeb:Servlet必会必知

    从[JavaEE 要懂的小事] Http相关,一直想写点Web开发相关的.最近项目接口开发紧,还有准备新的九月份战斗.JDK IO源码就隔一段落,温故知新看看Servlet & JSP 相关. ...