您的位置:首页 > 其它

项目中使用protobuf 3.0

2017-04-28 23:43 507 查看
protocol buffer从3.0 原生的compiler支持c++,Java,Python,Go,Ruby,JavaNano,JavaScript,Objective-C,C#,PHP这篇文章作为上一篇文章的补充,简单记录下一些变化。

protobuf的开源地址为:https://github.com/google/protobuf

protocol compiler下载地址为:https://github.com/google/protobuf/releases

官方定义message类型的例子:

syntax="proto3"

message SearchRequest{

  string query=1;

  int32 page_number=2;

  int32 result_per_page=3;

}

..proto文件的第一行指定使用proto3的语法。

特定语言的声明使用option关键定和选项名

option java_package="com.example.tutorial";//定义生成的java包

option java_outer_classname="AddressBookProtos";//定义java类名

option csharp_namespace="Google.Protobuf.Examples.AddressBook";//定义c#的命名空间

变化

1.字段前取消了required和optional两个关键字,目前可用的只有repeated关键字。

2.不可以现设置默认值了。

  a.string默认为空串

  b.枚举默认为第一个枚举定义的第一个值。并且必须是0

  c.bytes默认为空bytes

  d.bool默认为false

  e.数字类型默认为0

3.类型对应表

.proto TypeNotesC++ TypeJava TypePython Type[2]Go TypeRuby TypeC# TypePHP Type
doubledoubledoublefloatfloat64Floatdoublefloat
floatfloatfloatfloatfloat32Floatfloatfloat
int32Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.int32intintint32Fixnum or Bignum (as required)intinteger
int64Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.int64longint/long[3]int64Bignumlonginteger/string[5]
uint32Uses variable-length encoding.uint32int[1]int/long[3]uint32Fixnum or Bignum (as required)uintinteger
uint64Uses variable-length encoding.uint64long[1]int/long[3]uint64Bignumulonginteger/string[5]
sint32Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.int32intintint32Fixnum or Bignum (as required)intinteger
sint64Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.int64longint/long[3]int64Bignumlonginteger/string[5]
fixed32Always four bytes. More efficient than uint32 if values are often greater than 228.uint32int[1]intuint32Fixnum or Bignum (as required)uintinteger
fixed64Always eight bytes. More efficient than uint64 if values are often greater than 256.uint64long[1]int/long[3]uint64Bignumulonginteger/string[5]
sfixed32Always four bytes.int32intintint32Fixnum or Bignum (as required)intinteger
sfixed64Always eight bytes.int64longint/long[3]int64Bignumlonginteger/string[5]
boolboolbooleanboolboolTrueClass/FalseClassboolboolean
stringA string must always contain UTF-8 encoded or 7-bit ASCII text.stringStringstr/unicode[4]stringString (UTF-8)stringstring
bytesMay contain any arbitrary sequence of bytes.stringByteStringstr[]byteString (ASCII-8BIT)ByteStringstring
proto代码编译

语法:

protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR --java_out=DST_DIR --python_out=DST_DIR --go_out=DST_DIR --ruby_out=DST_DIR --javanano_out=DST_DIR --objc_out=DST_DIR --csharp_out=DST_DIR path/to/file.proto

--proto_path 当proto文件中使用import时指定的导入文件的位置

--cpp_out c++输出目录

--java_out java输出目录

--python_out

--go_out

--ruby_out ruby输出目录

--objc_out oc输出目录

--csharp_out c#输出目录

path/to/file.proto为要编译的proto文件

使用

proto内容:

syntax="proto3";

option java_package="com.ztimage";
option java_outer_classname="WebUI";
option csharp_namespace="ZTImage.WebUI";
message SearchRequest{
string query=1;
int32 page_number=2;
int32 result_per_page=3;
}

执行命令:protoc --csharp_out d:/programs/protoc/bin WebUI.proto

生成代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Google.Protobuf;

namespace ZTImage.WebUI
{
class Program
{
static void Main(string[] args)
{
SearchRequest request = new SearchRequest() {
Query="age>0 and age <18",
PageNumber=1,
ResultPerPage=50
};

using (var output = File.Create("mr.dat"))
{
request.WriteTo(output);
}

SearchRequest sr = null;
using (var input = File.OpenRead("mr.dat"))
{
sr = SearchRequest.Parser.ParseFrom(input);
}

Console.WriteLine("Query:{0},PageNumber:{1},ResultPerPage:{2}",sr.Query,sr.PageNumber,sr.ResultPerPage);
Console.ReadKey();

}
}
}


View Code
结果:

Query:age>0 and age <18,PageNumber:1,ResultPerPage:50

pref:

500W writer 2022ms read 1864ms
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: