zoukankan      html  css  js  c++  java
  • Protobuf

    主要分2种

    P1:Google.Protobuf:分v2和v3;

    V3的类型对照表,地址见这里

    V2的类型对照表,见这里

     

    V3的用法

    1、NET4.5的项目,安装Nuget包<Google.Protobuf>和<Google.Protobuf.Tools>

    2、编写proto文件,类型参照上文定义;放一个demo.proto

    syntax = "proto3";
    package protobuf_unittest_import;
    option csharp_namespace = "Export.DAL";
    
    message ListFloat
    {
    repeated float items =1;
    }
    
    message CircleInfoBuf
        {
             int32 No =1;
             string Name =2;
             float Diameter =3;
             float Length =4;
             ListFloat Points =5;
        }

    3、运行packagesGoogle.Protobuf.Tools.3.9.1 oolswindows_x64下的protoc.exe,执行命令,转成cs代码;

    protoc.exe --proto_path=所在目录 --csharp_out=生成的目录   demo.proto 

    4、引用此cs文件,编写其他代码

    5、序列化和反序列化

    序列化

                string bufFile = "";
                using (FileStream fs = new FileStream(bufFile, FileMode.CreateNew))
                {
                    using (CodedOutputStream cos = new CodedOutputStream(fs))
                    {
                        list.WriteTo(cos);//需序列化的对象
                        fs.Flush();
                    }
                }

    反序列化

                using (FileStream fs = new FileStream(bufFile, FileMode.Open))
                {
                    using (CodedInputStream cos = new CodedInputStream(fs))
                    {
                        CircleInfoBuf list = CircleInfoBuf.Parser.ParseFrom(cos);
                        return list;
                    }
                }

    P2:protobuf-net

    1、定义类

     [ProtoContract]
     public class CircleInfo
        {
            [ProtoMember(1)]
            public int No { get; set; }
            [ProtoMember(2)]
            public string Name { get; set; }
            [ProtoMember(3)]
            public float Diameter { get; set; }
            [ProtoMember(4)]
            public float Length { get; set; }
            [ProtoMember(5)]
            public float[] Points { get; set; }
        }

     序列化

                string bufFile = "";
                using (FileStream fs = new FileStream(bufFile, FileMode.OpenOrCreate))
                {
                    ProtoBuf.Serializer.Serialize(fs, list);//需要序列化的对象
                    fs.Flush();
                }

    反序列化

            T Load<T>(string bufFile)
            {
                T list = default(T);
                using (FileStream fs = new FileStream(bufFile, FileMode.Open))
                {
                    list = ProtoBuf.Serializer.Deserialize<T>(fs);
                }
                return list;
            }

    ------------------------------

    对比性能测试Google.Protobuf(3.9.1.0)、.protobuf(2.4.0.0)-net和Json(Newtonsoft.Json 12.0.0.0),

    序列化和反序列化的时间

    Google.Protobuf > protobuf-net > Json

    ------------------------------

  • 相关阅读:
    sublime text 2安装Emment插件
    PHPExcel IE导出乱码问题
    还是PHPExcel问题
    一条SQL语句查询两表中两个字段
    PHPExcel导出插入图片和居中问题
    jqgrid demo
    openstack horizon 学习(1) 总览
    Python学习笔记
    微软2016校园招聘在线笔试 [Recruitment]
    动态树学习(留坑)
  • 原文地址:https://www.cnblogs.com/feedback/p/11352520.html
Copyright © 2011-2022 走看看