zoukankan      html  css  js  c++  java
  • Google Protocol Buffer 用法 C#

    在网上查了一下,虽然有很多文章介绍Protocol Buffer,但是实际使用起来,还是会遇到很多问题,所以我想应该有一个指南一样的东西,让新手很快就能使用它。

    Protocol Buffer简写为Protobuf,是Google开发的一种储存数据的方式,功能与XML一样,但更方便,数据量更小,速度更快,在序列化和反序列化的时候使用,有很大的优势。比如,网络游戏的通讯协议编写。更重要的是,它是一个开源项目。

    闲话不多说,下载地址:

    http://code.google.com/p/protobuf/downloads/list

    由于Protobuf不能生成C#代码,所以就要用到另外一个开源项目protobuf-net,下载地址:

    http://code.google.com/p/protobuf-net/

    @echo off
    rem 查找文件
    for /f "delims=" %%i in ('dir /b ".*.proto"') do echo %%i
    for /f "delims=" %%i in ('dir /b/a "*.proto"') do protoc -I=. --cpp_out=. %%i
    for /f "delims=" %%i in ('dir /b/a "*.proto"') do protogen -i:%%i -o:%%~ni.cs
    pause

    用法是,在命令行用protoc.exe依据你自己定义的.proto文件,来生成.cpp文件

    用protobuf-net的protogen.exe来生成.cs文件,可以写一个批处理,如下:

    protoc -I=. --cpp_out=. Net.proto     //在当前目录下,以cpp方式编译Net.proto

    protogen -i:Net.proto -o:Net.cs        //在当前目录下,用Net.proto生成Net.cs

    其实两句功能是一样,只是分别生成了Net.proto的cpp文件和cs文件,这样就可以在两种语言编写的应用程序间通信了。

    Net.proto文件内容如下:

     
    1. message SearchRequest {  
    2.   required string query = 1;  
    3.   optional int32 page_number = 2;  
    4.   optional int32 result_per_page = 3;  
    5. }  

    数据类型如下:

    .proto TypeNotesC++ TypeJava Type
    double   double double
    float   float float
    int32 Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. int32 int
    int64 Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. int64 long
    uint32 Uses variable-length encoding. uint32 int[1]
    uint64 Uses variable-length encoding. uint64 long[1]
    sint32 Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. int32 int
    sint64 Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. int64 long
    fixed32 Always four bytes. More efficient than uint32 if values are often greater than 228. uint32 int[1]
    fixed64 Always eight bytes. More efficient than uint64 if values are often greater than 256. uint64 long[1]
    sfixed32 Always four bytes. int32 int
    sfixed64 Always eight bytes. int64 long
    bool   bool boolean
    string A string must always contain UTF-8 encoded or 7-bit ASCII text. string String
    bytes May contain any arbitrary sequence of bytes. string ByteString
     

     

     

    http://blog.csdn.net/wangpei421/article/details/8012295

  • 相关阅读:
    Java中NIO和IO区别和适用场景
    JDK和CGLIB动态代理原理
    java中的Serializable接口的作用
    redis采用序列化方案存对象
    在时间复杂度为O(n)且空间复杂度为O(1)的情况下翻转链表
    给定一个排好序的数组,然后求出丢失的数字
    求字符串里超过字符长度一半的元素
    求你给定两字符串包含的字母数是否完全一致
    动态规划,求数组不相邻数字的最大子串值
    JWT 工具
  • 原文地址:https://www.cnblogs.com/tianciliangen/p/4679803.html
Copyright © 2011-2022 走看看