什么是ProtoBuf-net

Protobuf是google开源的一个项目,用户数据序列化反序列化,google声称google的数据通信都是用该序列化方法。它比xml格式要少的多,甚至比二进制数据格式也小的多。

Protobuf格式协议和xml一样具有平台独立性,可以在不同平台间通信,通信所需资源很少,并可以扩展,可以旧的协议上添加新数据

Protobuf是在java和c++运行的,Protobuf-net当然就是Protobuf在.net环境下的移植。

请参见:https://code.google.com/p/protobuf-net/

Get Start

[ProtoBuf.ProtoContract]
public class Person
{
[ProtoBuf.ProtoMember(1)]
public int Id { get; set; }
[ProtoBuf.ProtoMember(2)]
public string Name { get; set; }
[ProtoBuf.ProtoMember(3)]
public Address Address { get; set; }
} [ProtoBuf.ProtoContract]
public class Address
{
[ProtoBuf.ProtoMember(1)]
public string Line1 { get; set; }
[ProtoBuf.ProtoMember(2)]
public string Line2 { get; set; }
}

类前加上ProtoContract Attrbuit,成员加上ProtoMember Attribute即可,其中ProtoMember需要一个大于0的int类型的值,原则上这个int类型没有大小限制,但建议从1开始,这是一个良好的习惯,另外这个参数必需是这个类成员的唯一标识,不可重复

序列化

            var person = new Person
{
Id = 1,
Name = "First",
Address = new Address { Line1 = "Line1", Line2 = "Line2" }
};
using (var file = System.IO.File.Create("Person.bin"))
{
ProtoBuf.Serializer.Serialize(file, person);
}

反序列化

Person newPerson;
using (var file = System.IO.File.OpenRead("Person.bin"))
{
newPerson = ProtoBuf.Serializer.Deserialize<Person>(file);
}
使用起来很简单,代码移植也会相当方便,下面我要对比下序列化的文件大小。
1.使用ProtoBuf序列化1000个对象,查看Person.bin文件大小为:30 KB (29,760 字节)
List<Person> list = new List<Person>();
for (var i = 0; i < 1000; i++)
{
var person = new Person
{
Id = i,
Name = "Name"+i,
Address = new Address { Line1 = "Line1", Line2 = "Line2" }
};
list.Add(person);
} using (var file = System.IO.File.Create("Person.bin"))
{
ProtoBuf.Serializer.Serialize(file, list);
}

2.使用xml序列化1000个对象,Person.xml大小为:152 KB (155,935 字节)

            List<Person> list = new List<Person>();
for (var i = 0; i < 1000; i++)
{
var person = new Person
{
Id = i,
Name = "Name"+i,
Address = new Address { Line1 = "Line1", Line2 = "Line2" }
};
list.Add(person);
} System.Xml.Serialization.XmlSerializer xmlSerizlizer = new System.Xml.Serialization.XmlSerializer(typeof(List<Person>));
using(var file= System.IO.File.Create("Persion.xml")){
xmlSerizlizer.Serialize(file, list);
}

3. 使用binary序列化1000个对象,Person.dat大小为:54.1 KB (55,445 字节)

            List<Person> list = new List<Person>();
for (var i = 0; i < 1000; i++)
{
var person = new Person
{
Id = i,
Name = "Name"+i,
Address = new Address { Line1 = "Line1", Line2 = "Line2" }
};
list.Add(person);
} using(var file = new System.IO.FileStream("Person.dat", System.IO.FileMode.Create))
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter binaryFormatter =
new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
binaryFormatter.Serialize(file, list);
}

在这个实验中ProtoBuf比xml序列化小5倍,比二进制也近小一倍,有人说ProtoBuf比xml可以小到20倍,根据数据的复杂度这是有可能的。ProtoBuf的数据格式做为数据报文有着绝对优势,当然也有个弊端,它是2进制报文,没有xml格式这样的可读性,要想看懂报文内容只能用ProtoBuf反序列化了,不过我认识这基本上不是问题~

最新文章

  1. 关于app隐私设置跳转
  2. OC-常见错误 方法与函数的区别
  3. Homebrew
  4. DOCTYPE的笔记
  5. 一个误解: 单个服务器程序可承受最大连接数&ldquo;理论&rdquo;上是&ldquo;65535&rdquo;
  6. diy 电脑 重装系统
  7. oracle安装报错2
  8. Java源码学习 -- java.lang.String
  9. akoj-1074-人见人爱A^B
  10. PHPStudy+PHPStorm下配置隐藏项目入口文件
  11. 嵌入式QT移植
  12. python 简单实现淘宝关键字商品爬取
  13. 简单介绍python的双向队列
  14. 原生js实现数据单向绑定
  15. 二十:让行内元素在div中垂直居中
  16. fastDFS教程Ⅱ-文件服务器迁移
  17. idea及webstorm破解方法(转)
  18. python -m 命令单独运行一个文件,怎么解决单独运行文件报错?
  19. Qt-QMl-自定义自己想要的TabView
  20. python3-可变和不可变数据类型

热门文章

  1. ABAP术语-ABAP Editor
  2. php mysql 计算经纬之间距离 范围内筛选
  3. java 代码调用函数
  4. 使用Python对MySQL数据库操作
  5. xpath技术解析xm文件(php)
  6. CentOS7.2中安装MongoDB
  7. 如何本地搭建centos7虚拟主机?
  8. elasticsearch 5.x 系列之四(索引模板的使用,详细得不要不要的)
  9. 数据分析处理库Pandas——索引进阶
  10. 解决如下出错:DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and willraise ValueError in 0.19.