zoukankan      html  css  js  c++  java
  • 高效的序列化组件 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反序列化了,不过我认识这基本上不是问题~

  • 相关阅读:
    vue-webpack介绍
    vue-ES6模块化的导入和导出
    vue-前端模块化
    vue-插槽作用域的使用
    vue-具名插槽的使用
    vue-插槽的基本使用
    vue-父组件获取子组件对象实例
    IO(六)
    IO(五)
    关于overflow:hidden
  • 原文地址:https://www.cnblogs.com/MuNet/p/6638533.html
Copyright © 2011-2022 走看看