protobuf-net 与 C#中几种序列化的比较
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#中几种序列化的比较的更多相关文章
- 关于Django中,实现序列化的几种不同方法
前言 关于序列化操作,就是将一个可迭代的数据结构,通过便利的方式进行我们所需要的操作. 今天历来归纳一下,Django中的几种不同得分方法,已经Django-restframework提供的方法 创建 ...
- 十五天精通WCF——第十二天 说说wcf中的那几种序列化
我们都知道wcf是由信道栈组成的,在我们传输的参数走到传输信道层之前,先需要经过序列化的过程,也就是将参数序列化为message,这篇 我们就来说说这里的序列化,蛮有意思的,可能初学者也明白,在wcf ...
- [转]十五天精通WCF——第十二天 说说wcf中的那几种序列化
我们都知道wcf是由信道栈组成的,在我们传输的参数走到传输信道层之前,先需要经过序列化的过程,也就是将参数序列化为message,这篇 我们就来说说这里的序列化,蛮有意思的,可能初学者也明白,在wcf ...
- PHP四种序列化方案
原文地址:https://t.ti-node.com/thread/... 数据的序列化是一个非常有用的功能,然而目测很多人跟我一样,在刚接触这玩意的时候压根就不理解这货色到底是干啥用的,反正老师说了 ...
- Asp.net中Json的序列化和反序列化(一)
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...
- ASP.NET中JSON的序列化和反序列化
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介 ...
- C#[Serializable]在C#中的作用-NET 中的对象序列化
为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本:按值将对象从一个应用程序域发送至另一个应用程序域.例如,序列化可用于在 ASP.NET 中保 ...
- ASP.NET 中JSON 的序列化和反序列化
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...
- asp.net中对象的序列化,方便网络传输
对象序列化 是将对象状态转换为可保持或传输的格式的过程.反序列化 是将流转换为对象序列化和反序列化相结合 可以使对象数据轻松的存储和传递 在 .NET 中,如果是对象可序列化,需要在 声明对象的开始部 ...
随机推荐
- 项目支持Servlet3.0的新特性
一.Servlet3.0介绍 Servlet3.0是Java EE6规范的一部分,Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署描述 ...
- Framework7--Test
<!doctype html> <html> <head> <title>{{title}}</title> <meta charse ...
- mysql的sql_mode 模式修改 my.cnf
1. sql_mode模式 mysql数据库的中有一个环境变量sql_mode,定义了mysql应该支持的sql语法,数据校验等!我们可以通过以下方式查看当前数据库使用的sql_mode: mysql ...
- 特征工程 dataframe格式
import os import copy import codecs import operator import re from math import log from pyspark.sql ...
- 循序渐进Python3(五) -- 初识模块
什么是模块? 模块,用一组代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能 ...
- 在eclipse之中使用Junit
使用Junit单位测试,能够一定程度上减小项目bug的产生.很多时候,我们都是在main函数里面单独去测试一个方法,这样的测试非常不方便.使用Junit可以是测试单位和项目代码分离,一次性测试多个方法 ...
- Jquery easyui中的有效性检查
使用过程中的一积累,备查. EasyUI 验证框使用方法: //*************************** missingMessage:未填写时显示的信息 validType:验证类型见 ...
- JSP中显示用户信息
<%@ page language= "java" contentType="text/html;charset=UTF-8" %><%@ p ...
- .Net中几种常见的页面跳转传值方法
1.ASP Server对象Execute方法 ASP Server对象的Execute方法可以在执行当前页面的过程中将另一个页面执行结果的内容插入到当前页面的输出中.Execute方法带一个参数,是 ...
- EnterpriseLibrary 6.0中DAAB独立数据库配置文件初始化
string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "database.config"); IC ...