• Google Protocol Buffers 入门


    Google Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前支持主流的语言(javac++pythonc#go....)。

    具官方说法使用PB 进行序列化和反序列化性能是xml序列化和反序列化的20~100倍,在各种序列化和反序列化方式中,处于领先地位。

    PB的序列化结果是字节与字节的连接,省略了字段名称,在存储上也比其他方式要小,更节省空间。不过这样带来了可读性变差和调试困难。

    官方源码:https://github.com/google/protobuf

    各版本的编译结果下载地址:https://github.com/google/protobuf/releases

    官方介绍:https://developers.google.com/protocol-buffers/

    1、下载protoc

    在https://github.com/google/protobuf/releases中,可以看到多个系统的protoc文件:

    protoc-3.3.0-linux-x86_32.zip                           

    protoc-3.3.0-linux-x86_64.zip        

    protoc-3.3.0-osx-x86_32.zip           

    protoc-3.3.0-osx-x86_64.zip                          

    protoc-3.3.0-win32.zip

    下载后,解压就可以。

    2、在解压目录创建一个*.proto 文件。

    如:test.proto

    syntax = "proto3"; 

    message test{  

      double Id=1;   

    string Name=2;

    }

    syntax = "proto3"; 为指定一个版本,此含义为使用proto3

    message为关键字,test为类名

    double/string为类字段类型,Id/Name为字段属性,1/2为存储序号,定义后不可变

    详细定义和使用方法参考:https://developers.google.com/protocol-buffers/docs/proto3#simple

    3、生成各种语言的类文件

    protoc --cpp_out="./"  --java_out="./"   --csharp_out="./"  ./test.proto

    “./”为当前protoc所在目录,protoc为可执行文件

    4、序列化与反序列化(以下C#示例)

     Google.Protobuf.IMessage test= new test() {  Id= 3333555555234234.333, Name= "dfsdfsdfsdfsdfsdfsdfs"};  //创建test对象
    
     byte[] buf = null;
     using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
     {
         //序列化
         using (Google.Protobuf.CodedOutputStream output = new Google.Protobuf.CodedOutputStream(ms))
         {
            test.WriteTo(output);
         }
    
                        
         buf = ms.ToArray();
     }
    
     test newTest = new test();
     using (Google.Protobuf.CodedInputStream input = new Google.Protobuf.CodedInputStream(buf))
     {
         //反序列化
         newTest.MergeFrom(input);
     }
  • 相关阅读:
    内存页面的各种属性(就是Read, Write, Execute的组合)
    分配粒度和内存页面大小(x86处理器平台的分配粒度是64K,内存页是4K,所以section都是0x1000对齐,硬盘扇区大小是512字节,所以PE文件默认文件对齐是0x200)
    NULL指针区域(NULL定义为0-65535之间的任何数都可以)
    Tiny Mapper是一个.net平台开源的对象映射组件
    表达式树动态拼接lambda
    VSC调试.NET Core 应用程序
    领域驱动设计之单元测试最佳实践
    web框架python
    无需安装Mono的Jexus
    分布式发布订阅消息系统Kafka
  • 原文地址:https://www.cnblogs.com/hobinly/p/7157481.html
Copyright © 2020-2023  润新知