protobuf-net

什么是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);
            }

image

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

posted @ 2014-01-03 23:09  徐某人  阅读(23492)  评论(6编辑  收藏  举报