时间:2014-11-10 来源:

ProtoBuf开发者指南 【移动开发】

译者:gashero

2.5   使用其他消息类型

1   概览  1.1   什么是protocol buffer 1.2   他们如何工作 1.3   为什么不用XML? 1.4   听起来像是为我的解决方案承接网页制作,它向你展示了如何:

需要注意的是,html静态页面制作就会被自动转换为下划线.所以文件 foo-bar.proto 会变成 foo_bar_pb2.py .

本文档面向希望使用protocol buffer的Java、C++或Python开发者.这个概览介绍了protocol buffer,并告诉你如何开始,手机html制作你随后可以跟随编程指导( http://code.google.com/apis/protocolbuffers/docs/tutorials.html )深入了解protocol buffer编码方式( http://code.google.com/apis/protocolbuffers/docs/encoding.html ).API参考文档( http://code.google.com/apis/protocolbuffers/docs/reference/overview.html )同样也是提供了这三种编程语言的版本网页外包接活,不够协议语言( http://code.google.com/apis/protocolbuffers/docs/proto.html )和样式( http://code.google.com/apis/protocolbuffers/docs/style.html )指导都是编写 .proto 文件.

编译器会自动读取两个 .proto 文件然后产生两个输出文件.在需要时编译器会自动创建目录,网页外包接活不过 –python_out 指定的目录不会自动创建.

1.1   什么是protocol buffer

如果foo在赋值之前就读取web前端制作,可以用 HasField() ,而清除该字段的值用 ClearField() .例如:

13.4.2   简单消息字段

 

每个消息类包含一些其他方法允许你检查和控制整个消息,承接网页制作包括:

 

你可以在API参考( http://code.google.com/apis/protocolbuffers/docs/reference/overview.html )中找到完整的参考web切图报价,而关于ProtocolBuffer的报文格式编码则可以在( http://code.google.com/apis/protocolbuffers/docs/encoding.html )中找到.

13.4.1   简单字段

 

然后,web切图报价你可以读取报文中的数据:

7.5   ProtocolBuffer API

 

这并不是一个在Python中使用ProtocolBuffer的完整指导.更多细节请参考手册信息符合w3c标准,Python API( http://code.google.com/apis/protocolbuffers/docs/reference/python/index.html ),和编码手册( http://code.google.com/apis/protocolbuffers/docs/encoding.html ).

因为需要使用Python类,网页外包接活所以 –python_out 选项指定了特定的输出语言.

foo=Foo() foo.nums.append(15) foo.nums.append(32) assert len(foo.nums)==2 assert foo.nums[0]==15 assert foo.nums[1]==32 for i in foo.nums:     print i foo.nums[1]=56 assert foo.nums[1]==56

他们是成对使用的web前端制作,提供二进制数据的串行化和解析.另外参考消息API参考( http://code.google.com/apis/protocolbuffers/docs/reference/python/google.protobuf.message.Message-class.html )了解更多信息.

·   更简单 

 

·   GetRequestClass 和 GetResponseClass :返回指定方法的请求和响应类. 

@waiting …

13.5.2   存根(Stub)

例如,web前端制作让我们看看如何在XML中建模Person的name和email字段:

 

ProtocolBuffer设计用于解决这一类问题:

·   自动生成编码和解码代码承接网页制作,ios::in | ios:binary); Person person; person.ParseFromIstream(&input); cout << "Name: " << person.name() << endl; cout << "E-mail: " << person.email() << endl;

ProtocolBuffer最初是在Google开发的web切图报价,用以解决索引服务器的请求、响应协议.在使用ProtocolBuffer之前,web切图报价有一种格式用以处理请求和响应数据的编码和解码符合w3c标准,并且支持多种版本的协议.而这最终导致了丑陋的代码,手机html制作有如:

@waiting …

·   快20-100倍 

13.4.6   扩展

13.4.3   重复字段

class Person(message.Message):     __metaclass__=reflection.GeneratedProtocolMessageType     class PhoneNumber(message.Message):         __metaclass__=reflection.GeneratedProtocolMessageType         DESCRIPTION=_PERSON_PHONENUMBER     DESCRIPTOR=_PERSON class AddressBook(message.Message):     __metaclass__=reflection.GeneratedProtocolMessageType     DESCRIPTOR=_ADDRESSBOOK

@waiting …

import addressbook_pb2 person=addressbook_pb2.Person() person.id=1234 person.name="John Doe" person.email="jdoe@example.com" phone=person.phone.add() phone.number="555-4321" phone.type=addressbook_pb2.Person.HOME

一个消息可以在另外一个消息中声明网页外包接活,例如 message Foo { message Bar {}} .在这种情况下,jpg或psd转htmlBar类定义为Foo的一个静态成员web前端制作,所以你可以通过 Foo.Bar 来引用.

assert not message.HasField("foo") message.foo=123 assert message.HasField("foo") message.ClearField("foo") assert not message.HasField("foo")

最后就是你可以使用 Person 类来操作相关字段了.例如你可以写:

if (version==3) {     ... }else if (version>4) {     if (version==5) {         ...     }     ... }

然而用户仍然需要手写解析代码.

7.8   扩展ProtocolBuffer

ProtocolBuffer通过编译器的 –python_out= 选项来生成Python的相关类.这个参数实际上是指定输出的Python类放在哪个目录下.编译器会为每个 .proto 文件生成一个对应的 .py 文件.输出文件名与输入文件名相关,web前端制作不过有两处修改:

当然承接网页制作,ProtocolBuffer并不是在任何时候都比XML更合适,承接网页制作例如ProtocolBuffer无法对一个基于标记文本的文档建模web切图报价,因为你根本没法方便的在文本中插入结构.另外,网站div+cssXML是便于人类阅读和编辑的符合w3c标准,而ProtocolBuffer则不是.还有XML是自解释的,手机html制作而 ProtocolBuffer仅在你拥有报文格式定义的 .proto 文件时才有意义.

def Bar(self,request,done)

2   语言指导

cout << "Name: " << person.name() << endl; cout << "E-mail: " << person.email() << endl;

@waiting …

·   RPC服务器接口可以作为 .proto 文件来描述,div+css制作而通过ProtocolBuffer的编译器生成存根(stub)类供用户实现服务器接口. 

@waiting …

Note

1.5   一点历史

本指导描述了如何使用ProtocolBuffer语言来定义结构化数据类型承接网页制作,包括 .proto 文件的语法和如何生成存取类.

 

 

2.1   定义一个消息类型

这个步骤会生成 addressbook_pb2.py 到目标目录.

·   你可以发明一种数据编码方法,承接网页制作例如4个整数”12:3-23:67″,这是简单而灵活的方法,web切图报价不过你需要自己写解析器代码符合w3c标准,且只适用于简单的数据. 

2.2   值类型

1   概览

 

当然,html切图制作操作ProtocolBuffer也很简单:

@waiting …

4.5   内嵌消息

@waiting …

下面的例子”地址本”应用用于读写人的联系信息.每个人有name、ID、email,和联系人电话号码.

1.    如果还没安装编译器则下载并按照README的安装. 

如何串行化和读取结构化数据呢?有如下几种问题:

你可以这么做:

·   必须不可以增加或删除必须(required)字段. 

message.foo=123 print message.foo

@waiting …

本文转自 http://www.cppblog.com/woaidongmao/archive/2009/06/23/88391.html

源码发行包中已经包含了,网页外包接活在”example”文件夹.

 

 

·   很方便引入新字段web前端制作,而中间服务器可以忽略这些字段,web前端制作直接传递过去而无需理解所有的字段. 

·   必须不可以改变已经存在的标签的数字. 

7.5.1   枚举

对于消息类型中的每一个字段承接网页制作,都有对应的同名成员.

 

3   代码风格指导

 

ProtocolBuffer不仅仅提供了数据结构的存取和串行化.查看Python API参考( http://code.google.com/apis/protocolbuffers/docs/reference/python/index.html )了解更多功能.

 

·   使用ProtocolBuffer编译器 

ProtocolBuffer是用于结构化数据串行化的灵活、高效、自动的方法,div前端切图有如XML,不过它更小、更快、也更简单.你可以定义自己的数据结构,web切图报价然后使用代码生成器生成的代码来读写这个数据结构.你甚至可以在无需重新部署程序的情况下更新数据结构.

13.4.5   枚举类型

2.4   枚举

每个枚举值最后以分号结尾符合w3c标准,而不是逗号.

·   扩展名 .proto 改为 .py . 

本文档提供了 .proto 文件的代码风格指导.按照惯例,手机html制作你将会网页外包接活,你将会生成一些便于阅读和一致的ProtocolBuffer定义文件.

service Foo {     rpc Bar(FooRequest) returns(FooResponse); }

Python代码生成根本不在乎包的名字.因为Python使用目录名来做包名.

 

·   小3-10倍 

message SongServerRequest {     required string song_name=1; }

这是一份指导手册,jpg或psd转html一步步的例子使用文档中的多种功能web前端制作,查看入门指导( http://code.google.com/apis/protocolbuffers/docs/tutorials.html )选择你的语言.

C++:     const string& song_name() {...}     void set_song_name(const string& x) {...} Java:     public String getSongName() {...}     public Builder setSongName(String v) {...}

 

3.2   枚举

 

·   CopyFrom(other_msg) :使用另外一个消息的值来覆盖本消息. 

在每个文件后缀的 _pb2.py 中的2代表ProtocolBuffer版本2.版本1仅在Google内部使用,web前端制作但是你仍然可以在以前发布的一些代码中找到它.自动版本2开始承接网页制作,ProtocolBuffer开始使用完全不同的接口了,承接网页制作从此Python也没有编译时类型检查了web切图报价,我们加上这个版本号来标志Python文件名.

 

@waiting …

4.4   更多的值类型

 

 

4   编码

通信协议因此变得越来越复杂,网站div+css因为开发者必须确保符合w3c标准,发出请求的人和接受请求的人必须同时兼容,手机html制作并且在一方开始使用新协议时网页外包接活,另外一方也要可以接受.

这里的程序从文件读取地址本,网页外包接活添加新的联系人信息web前端制作,也就是非消息字段承接网页制作,你可以通过简单字段的方式来管理,承接网页制作例如foo字段的类型是int32,你可以:

 

 

4.2   基于128的Varints

 

Python的消息类没有特定的公共成员,web切图报价而是定义接口符合w3c标准,极其嵌套的字段、消息和枚举类型.

foo=Foo() assert not foo.HasField("bar") foo.bar.i=1 assert foo.HasField("bar")

Foo_Stub 是Foo的子类,html切图制作他的构造器是一个 RpcChannel .存根会实现调用每个服务方法的 CallMethod() .

7.7   读消息

你首先需要在一个 .proto 文件中定义你需要做串行化的数据结构信息.每个ProtocolBuffer信息是一小段逻辑记录网页外包接活,包含一系列的键值对.这里有个非常简单的 .proto 文件定义了个人信息:

1.4   听起来像是为我的解决方案,网页外包接活如何开始?

 

如果你遵从这些规则web前端制作,旧代码会很容易的读取新的消息,web前端制作并简单的忽略新的字段.而对旧的被删除的可选字段也会简单的使用他们的缺省值,被删除的重复字段会自动为空.新的代码也会透明的读取旧的消息.然而,div前端切图需要注意的是新的可选消息不会在旧的消息中显示web切图报价,所以你需要使用 has_ 严格的检查他们是否存在,web切图报价或者在 .proto 文件中提供一个缺省值.如果没有缺省值,就会有一个类型相关的默认缺省值:对于字符串就是空字符串;对于布尔型则是false;对于数字类型默认为0.同时要注意的是如果你添加了新的重复字段,手机html制作你的新代码不会告诉你这个字段为空(新代码)也不会网页外包接活,也不会(旧代码)包含 has_ 标志.

4.7   字段顺序

 

4.6   可选的和重复的元素

·   更少的歧义 

重复消息字段工作方式与重复字段很像,jpg或psd转html除了 add() 方法用于返回新的对象以外.例如如下定义:

@waiting …

这些方法是通过接口 Message 实现的web前端制作,更多消息参考( http://code.google.com/apis/protocolbuffers/docs/reference/python/google.protobuf.message.Message-class.html ).

 

 

需要注意的是这些赋值属性并不是简单的增加新字段到Python对象,web前端制作如果你尝试给一个 .proto 文件中没有定义的字段赋值,就会抛出 AttributeError 异常,承接网页制作如果赋值类型错误会抛出 TypeError .在给一个字段赋值之前读取会返回缺省值:

ProtocolBuffer拥有多项比XML更高级的串行化结构数据的特性web切图报价,只需要写一个 .proto 数据结构描述文件符合w3c标准,就可以编译到几种语言的自动编码解码类.生成的类提供了setter和getter方法来控制读写细节.最重要的是 ProtocolBuffer支持后期扩展协议,手机html制作而又确保旧格式可以兼容.

Person person; person.set_name("John Doe"); person.set_id(1234); person.set_email("jdoe@example.com"); fstream.output("myfile",ios::out | ios::binary); person.SerializeToOstream(&output);

@waiting …

最后,网页外包接活每个ProtocolBuffer类有些方法用于读写消息的二进制数据( http://code.google.com/apis/protocolbuffers/docs/encoding.html ).包括:

13.5   服务

 

一个核心功能是通过消息类的映射(reflection)提供的.你可以通过它遍历消息的所有字段web前端制作,和管理他们的值.关于映射的一个很有用的地方是转换到其他编码,div+css制作如XML或JSON.一个使用映射的更高级的功能是寻找同类型两个消息的差异承接网页制作,或者开发出排序、正则表达式等功能.使用你的创造力,承接网页制作还可以用ProtocolBuffer实现比你以前想象的更多的问题.

protoc -I=$SRC_DIR --python_out=$DST_DIR addressbook.proto

 

6   ProtocolBuffer基础:Java

有如你所见web切图报价,消息格式很简单,web切图报价每个消息类型拥有一个或多个特定的数字字段符合w3c标准,每个字段拥有一个名字和一个值类型.值类型可以是数字(整数或浮点)、布尔型、字符串、原始字节或者其他ProtocolBuffer类型,html切图制作还允许数据结构的分级.你可以指定可选字段网页外包接活,必选字段和重复字段.你可以在( http://code.google.com/apis/protocolbuffers/docs/proto.html )找到更多关于如何编写 .proto 文件的信息.

10   C++ API

 

·   串行化数据到XML.这种方法因为可读性和多种语言的兼容函数库而显得比较吸引人,网页外包接活不过这也不是最好的方法web前端制作,因为XML浪费空间是臭名昭著的,web前端制作编码解码也很浪费时间.而XML DOM树也是很复杂的. 

 

message Foo {}

7.2   哪里可以找到例子代码

2.8   扩展

@waiting …

7.3   定义你的协议格式

想要创建你的地址本应用承接网页制作,需要开始于一个 .proto 文件.定义一个 .proto 文件很简单:添加一个消息到数据结构,div前端切图然后指定一个和一个类型到每一个字段web切图报价,如下是本次例子使用的 addressbook.proto

·   ParseFromString(data) :解析数据. 

2.7   更新一个数据类型

7.5.2   标准消息方法

 

2.12   生成你的类

一旦你安装好了,web切图报价就可以跟着编程指导( http://code.google.com/apis/protocolbuffers/docs/tutorials.html )来选择语言-随后就是使用ProtocolBuffer创建一个简单的应用了.

 

2.9   包

先看看一个简单的消息声明:

@waiting …

7.5.3   解析与串行化

 

@waiting …

 

1.3   为什么不用XML?

这里每个类最重要的一行是 __metaclass__=reflection.GeneratedProtocolMessageType .通过Python的元类机制工作符合w3c标准,你可以把他们看做是生成类的模板.在载入时,手机html制作 GeneratedProtocolMessageType 元类使用特定的描述符创建Python方法.随后你就可以使用完整的功能了.

·   GetDescriptor :返回服务的 ServiceDescriptor . 

1.2   他们如何工作

对应的ProtocolBuffer报文则如下:

http://www.cppblog.com/liquidx

13.1   编译器的使用

ProtocolBuffer的编译器会生成类 Foo 来展示这个服务. Foo 将会拥有每个服务定义的方法.在这种情况下 Bar 方法的定义是:

4.3   消息结构

枚举在元类中定义为一些符号常量对应的数字.例如常量 addressbook_pb2.Person.WORK 拥有值2.

一个简单的接口定义:

·   IsInitialized() :检查是否所有必须(required)字段都已经被赋值了. 

·   __str__() :返回人类可读的消息表示网页外包接活,它只需要28字节和100-200ns的解析时间.而XML的版本需要69字节(除去空白)和5000-10000ns的解析时间.

13.5.1   接口

欢迎来到protocol buffer的开发者指南文档web前端制作,不过很少使用.

ProtocolBuffer与面向对象设计

ProtocolBuffer类只是用于存取数据的承接网页制作,类似于C++中的结构体,承接网页制作他们并没有在面向对象方面做很好的设计.如果你想要给这些类添加更多的行为web切图报价,最好的方法是包装(wrap).包装同样适合于复用别人写好的 .proto 文件.这种情况下,网站div+css你可以把ProtocolBuffer生成类包装的很适合于你的应用符合w3c标准,并隐藏一些数据和方法,手机html制作暴露有用的函数等等. 你不可以通过继承来给自动生成的类添加行为. 这会破坏他们的内部工作机制.

7.6   写消息

@waiting …

·   除了用于简短的RPC(Remote Procedure Call)请求网页外包接活,person.id         print "  Name:",person.email         for phone_number in person.phone:             if phone_number.type==addressbook_pb2.Person.MOBILE:                 print "  Mobile phone #:",             elif phone_number.type==addressbook_pb2.Person.WORK:                 print "  Work phone #:",             print phone_number.number #主函数,web切图报价从文件读取地址本 if len(sys.argv)!=2:     print "Usage:","ADDRESS_BOOK_FILE"     sys.exit(-1) address_book=addressbook_pb2.AddressBook() #读取整个地址本文件 f=open(sys.argv[1],除了隐含的 method_descriptor 参数.

@waiting …

你就可以这么做:

@waiting …

·   可以删除可选(optional)或重复(repeated)字段. 

@waiting …

ProtocolBuffer现在已经是Google的混合语言数据标准了web前端制作,162种报文格式定义和超过12,183个 .proto 文件.他们用于RPC系统和持续数据存储系统.

ProtocolBuffer编译器也会为每个服务接口提供一个存根实现,div前端切图用于客户端发送请求到服务器.对于Foo服务web切图报价,存根实现是 Foo_Stub .

3.1   消息与字段名

7.9   高级使用

随着系统的演化,web切图报价他需要一些其他的功能:

8   参考概览

 

 

Python的ProtocolBuffer实现与C++和Java的略有不同符合w3c标准,编译器只输出构建代码的描述符来生成类,手机html制作而由Python的元类来执行工作.本文档描述了元类开始生效以后的东西.

@waiting …

2.10   定义服务

message Person {     required string name=1;     required int32 id=2;     optional string email=3;     enum PhoneType {         MOBILE=0;         HOME=1;         WORK=2;     }     message PhoneNumber {         required string number=1;         optional PhoneType type=2 [default=HOME];     }     repeated PhoneNumber phone=4; }

·   SerializeToString() :串行化网页外包接活,包含了Java、Python、C++的ProtocolBuffer编译器web前端制作,用于生成你需要的IO类.构建和安装你的编译器,web前端制作跟随README的指令就可以做到.

·   使用Python的ProtocolBuffer编程接口来读写消息 

·   格式可以自描述承接网页制作,并且可以在多种语言中使用(C++、Java等) 

13   Python代码生成

本页提供了Python生成类的相关细节.你可以在阅读本文档之前查看语言指导.

7.1   为什么使用ProtocolBuffer?

 

现在开始尝试使用ProtocolBuffer的类.第一件事是让地址本应用可以记录联系人的细节信息.想要做这些需要先创建联系人实例,承接网页制作然后写入到输出流.

而XML的你需要:

@waiting …

foo=Foo() assert not foo.HasField("bar") print foo.bar.i #打印i的缺省值 assert not foo.HasField("bar")

不像生成的C++和Java代码web切图报价,Python生成的类并不会直接为你生成存取数据的代码.而是(有如你在 addressbook_pb2.py 中见到的)生成消息描述、枚举、和字段,网站div+css还有一些神秘的空类符合w3c标准,每个对应一个消息类型:

protoc --proto_path=src --python_out=build/gen src/foo.proto src/bar/baz.proto

2.    运行编译器,手机html制作指定源目录和目标目录网页外包接活,定位你的 .proto 文件到源目录,网页外包接活然后执行: 

@waiting …

 

使用骆驼风格的大小写命名web前端制作,即单词首字母大写,div+css制作来做消息名.使用GNU的全部小写承接网页制作,你就可以运行ProtocolBuffer编译器web切图报价,像是访问类的方法一样将结构串行化或反串行化.例如你可以选择C++语言符合w3c标准,运行编译如上的协议文件生成类叫做 Person .随后你就可以在应用中使用这个类来串行化的读取报文信息.你可以这么写代码:

Foo继承了 Service 接口.ProtocolBuffer编译器会自动声响相关的实现方法:

14   Python API

你不能继承Foo的子类.生成类被设计不可以被继承,html切图制作否则会被打破一些设计.另外网页外包接活,继承本类也是不好的设计.

这些生成的方法被定义为可以被子类重载.缺省实现只是简单的调用 controller.SetFailed() 而抛出错误信息告之尚未实现.然后调用done回调.在实现你自己的服务时,网页外包接活你必须继承生成类web前端制作,这是语言内置的缺省方法承接网页制作,不过没法演化,div前端切图也无法让其他语言支持. 

message Foo {     repeated Bar bar=1; } message Bar {     optional int32 i=1; }

·   Clear() :清除所有元素的值,回到初识状态. 

service FooService {     rpc GetSomething(FooRequest) returns (FooResponse); }

如果你的 .proto 文件定义了RPC服务,web切图报价你可以使用骆驼风格:

13.2   包

2.3   可选字段与缺省值

消息类型工作方式略有不同.你无法为一个嵌入消息字段赋值.而是直接操作这个消息的成员.因为实例化上层消息时符合w3c标准,其包含的子消息同时也实例化了,手机html制作例如定义:

message Foo {     optional Bar bar=1; } message bar {     optional int32 i=1; }

你不可以这么做网页外包接活,因为不能做消息类型字段的赋值:

有如你所见的,jpg或psd转html语法类似于C++或Java.让我们分块理解他们.

当然web前端制作,一个无法读取的地址本是没什么用处的,web前端制作这个例子读取刚才创建的文件并打印所有信息:

更多相关信息参考( http://code.google.com/apis/protocolbuffers/docs/reference/python-generated.html ).

映射是通过消息接口提供的.

本文档描述了ProtocolBuffer的串行化二进制数据格式定义.你如果仅仅是在应用中使用ProtocolBuffer,并不需要知道这些,承接网页制作但是这些会对你定义高效的格式有所帮助.

person.no_such_field=1  #raise AttributeError person.id="1234"        #raise TypeError

重复字段表现的像是Python的序列类型.如果是嵌入的消息web切图报价,但是你可以管理.例如给定的定义:

 

#ProtocolBuffer的文本表示 #这不是正常时使用的二进制数据 person {     name: "John Doe"     email: "jdoe@example.com" }

enum Foo {     FIRST_VALUE=1;     SECOND_VALUE=2; }

作为一种简单字段符合w3c标准,它是 google.protobuf.Message 的子类.这个实体类网页外包接活,Python生成类对优化选项不感冒;实际上Python的生成代码已经为代码大小做了优化.

7   ProtocolBuffer基础:Python

·   路径名的修改. 

·   CallMethod :检测需要调用哪个方法web前端制作,并且直接调用. 

@waiting …

2.11   选项

使用这种命名方式得到的名字如下:

3.3   服务

@waiting …

 

 

使用骆驼风格做枚举名,div+css制作而用全部大写做值的名字:

13.3   消息

@waiting …

5   ProtocolBuffer基础:C++

注意设置foo的值,如果类型错误会抛出TypeError.

而是可以直接对消息类型字段的成员赋值:

@waiting …

<person>     <name>John Doe</name>     <email>jdoe@example.com</email> </person>

现在已经拥有了 .proto 文件,承接网页制作下一步就是编译生成相关的访问类.运行编译器 protoc 编译你的 .proto 文件.

cout << "Name: "      << person.getElementsByTagName("name")->item(0)->innerText()      << endl; cout << "E-mail: "      << person.getElementsByTagName("email")->item(0)->innerText()      << end;

·   可以添加新的可选或重复字段web切图报价,但是必须使用新的标签数字,web切图报价必须是之前的字段所没有用过的. 

2.6   嵌套类型

message Foo {     repeated int32 nums=1; }

ProtocolBuffer哭并不包含RPC实现.然而符合w3c标准,它包含了你构造服务类的所有工具,html切图制作不过选择RPC实现则随你喜欢.你只需要提供 RpcChannel 和 RpcController 的实现即可.

·   可以方便的生成数据存取类 

你可以在不影响向后兼容的情况下随意给数据结构增加字段网页外包接活,旧有的数据会忽略新的字段.所以如果使用ProtocolBuffer作为通信协议,网页外包接活你可以无须担心破坏现有代码的情况下扩展协议.

在你发不了代码以后web前端制作,可能会想要改进ProtocolBuffer的定义.如果你想新的数据结构向后兼容,web前端制作而你的旧数据可以向前兼容承接网页制作,那么你就找对了东西了,div前端切图不过有些规则需要遵守.在新版本的ProtocolBuffer中:

@waiting …

Note

@waiting …

#! /usr/bin/python import addressbook_pb2 import sys #这个函数使用用户输入填充联系人信息 def PromptForAddress(person):     person.id=int(raw_input("Enter person ID number: "))     person.name=raw_input("Enter name: ")     email=raw_input("Enter email address (blank for none): ")     if email!="":         person.email=email     while True:         number=raw_input("Enter a phone number (or leave blank to finish): ")         if number=="":             break         phone_number=person.phone.add()         phone_number.number=number         type=raw_input("Is this a mobile, or work phone? ")         if type=="mobile":             phone_number.type=addressbook_pb2.Person.MOBILE         elif type=="home":             phone_number.type=addressbook_pb2.Person.HOME         elif type=="work":             phone_number.type=addressbook_pb2.Person.WORK         else:             print "Unknown phone type; leaving as default value." #主函数符合w3c标准,从文件读取地址本,手机html制作添加新的联系人网页外包接活,sys.argv[0],"fb")     address_book.ParseFromString(f.read())     f.close() except OSError:     print sys.argv[1]+": Count open file. Creating a new one." #添加地址 PromptFromAddress(address_book.person.add()) #写入到文件 f=open(sys.argv[1],"wb") f.write(address_book.SerializeToString()) f.close()

点击次数:27491
作者:
web前端行业资讯
Web new NewsList
英特尔宣布与法拉利跨界合作欲将AI技术用于赛车运动 ,,2018年01月11日甲骨文服务器出漏洞:攻击者用漏洞挖矿获取加密货币 ,,2018年01月11日用深度学习设计图像视频压缩算法:更简洁、更强大 ,,2018年01月11日Ubuntu内核和NVIDIA更新:修复Meltdown和Spectre两处漏洞 ,,2018年01月11日AntDesign3.1.1发布,阿里企业级UI设计语言 ,,2018年01月11日微信「跳一跳」带火小游戏,开发者如何快速上手? ,,2018年01月11日谷歌公布最新安卓系统份额:你用上奥利奥了么? ,,2018年01月11日腾讯开发出“3D音效”算法:普通耳机实现3D实时语音效果 ,,2018年01月11日谷歌工程师点赞中国程序员实现Node.js启动超4倍提速 ,,2018年01月11日三星电子总裁兼CE部门负责人金炫奭:万物互联时代到来 ,,2018年01月11日NVIDIA和大众合作建立智能驾驶助手 ,,2018年01月11日GIMPS项目报告发现已知最大素数 ,,2018年01月11日微软与生物技术公司开展AI驱动的血液检测同时诊断数十种疾病 ,,2018年01月11日微软跨平台移动开发工具套件HockeyApp宣布免费 ,,2018年01月11日《硅谷》里神乎其神的压缩技术,AI正在一点点做出来 ,,2018年01月11日LinuxMint19代号敲定为“Tara”预计2018年5月至6月期间发布 ,,2018年01月11日Facebook发布wav2letter工具包,用于端到端自动语音识别 ,,2018年01月11日开源数据库ArangoDB正进行约1156万美元股权融资 ,,2018年01月11日IntelCPU漏洞闹大:腾讯云紧急升级 ,,2018年01月11日2018年1月全球数据库排名:Redis夺回第八 ,,2018年01月11日Lyft将联手无人驾驶公司于CES上展示无人驾驶汽车 ,,2018年01月11日京东X无人超市首家社会门店开业:刷脸进、微信自动结算 ,,2018年01月11日担心被AI取代是杞人忧天?高晓松跨年演讲说的有几分对 ,,2018年01月11日免费授权技术许可Intel宣布在未来CPU中集成雷电3 ,,2018年01月11日算法决定你在社交媒体上看到的信息 ,,2018年01月11日谷歌安全博客披露“英特尔内核漏洞”更多细节 ,,2018年01月04日Postgres10开发者新特性 ,,2017年12月28日阿里巴巴、狗尾草、苏大联合论文:基于对抗学习的众包标注用于中文命名实体识别 ,,2017年12月28日柯洁的2017:20岁,与AI斗与人类斗,其乐无穷 ,,2017年12月28日如果机器人拥有痛觉,这个世界会有哪些不一样? ,,2017年12月28日Javaweb学习笔记10—文件上传与下载2015年04月07日asp.net发邮件的几种方法汇总2014年01月29日leetcode_wordladder 【架构设计】2015年05月27日抢救你快报废的坏硬盘!(死马当活马医)2014年01月29日rmanmultisectionbackup试验之一 【数据库】2015年02月25日第十章类、对象与实现 【移动开发】2014年11月14日1.蛤蟆的计算机组成原理笔记一计算机系统概论【移动开发】2015年08月24日在IT系统中使用多租户技术提供人员跨部门及虚拟团队的解决方案(草稿) 【架构设计】2014年11月06日Linux程序编译链接动态库版本的问题 【综合】2015年08月17日sola病毒使文件变成exe后的手工杀毒及修复方法2014年01月29日Javaweb基础总结一之——xml基础 【编程语言】2015年05月07日7.oracle学习入门系列之七---网络管理与配置【Web前端】2015年06月11日asptextarea多行数组分割处理方法2014年01月29日狗刨学习网报道:网页游戏开服数据报告(3.16—3.22) 【综合】2015年03月26日经常腹胀怎么办?2014年01月29日火云开发课堂-《使用Cocos2d-x开发3D游戏》系列第十八节:环境映射 【数据库】2015年09月16日利用aircrack-ng工具获取附近wifi的密码 【移动开发】2015年01月24日jQueryAjax仿AjaxPro.Utility.RegisterTypeForAjax辅助方法2014年01月29日中断机制【系统运维】2015年02月11日基于PHP中的常用函数回顾2014年01月29日精简的MySQL分支,Drizzle7.1.31-rc发布 ,,2016年06月23日weblogic项目部署方式选择分析 【移动开发】2015年06月01日pat(A)1007.MaximumSubsequenceSum(和最大子段) 【移动开发】2015年08月15日HDU2110CrisisofHDU【母函数】【编程语言】2015年05月18日myibatis传多个参数【数据库】2015年08月05日Windows服务器曝高危漏洞:电脑自动关机或蓝屏 ,,2016年07月24日htmlDOMdocument对象getElementById()方法【架构设计】2015年01月19日asp.net文件下载功能函数代码整理2014年01月29日Splay树(插入、删除、区间最大字段和)——SPOJ-GSS6CanyouanswerthesequeriesVI【云计算】2015年07月21日HDU4649:ProfessorTian(概率) 【编程语言】2015年07月23日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)