- 浏览: 1504360 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (419)
- XMPP (19)
- Android (180)
- Java (59)
- Network (4)
- HTML5 (13)
- Eclipse (9)
- SCM (23)
- C/C++ (4)
- UML (4)
- Libjingle (15)
- Tools&Softwares (29)
- Linphone (5)
- Linux&UNIX (6)
- Windows (18)
- Google (10)
- MISC (3)
- SIP (6)
- SQLite (5)
- Security (4)
- Opensource (29)
- Online (2)
- 文章 (3)
- MemoryLeak (10)
- Decompile (5)
- Ruby (1)
- Image (1)
- Bat (4)
- TTS&ASR (28)
- Multimedia (1)
- iOS (20)
- Asciiflow - ASCII Flow Diagram Tool.htm (1)
- Networking (1)
- DLNA&UPnP (2)
- Chrome (2)
- CI (1)
- SmartHome (0)
- CloudComputing (1)
- NodeJS (3)
- MachineLearning (2)
最新评论
-
bzhao:
点赞123!
Windows的adb shell中使用vi不乱码方法及AdbPutty -
wahahachuang8:
我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方 ...
HTML5 WebSocket 技术介绍 -
obehavior:
view.setOnTouchListenerview是什么
[转]android 一直在最前面的浮动窗口效果 -
wutenghua:
[转]android 一直在最前面的浮动窗口效果 -
zee3.lin:
Sorry~~
When I build "call ...
Step by Step about How to Build libjingle 0.4
http://code.google.com/p/protobuf/
Protocol Buffers are a way of encoding structured data in an efficient yet extensible format. Google uses Protocol Buffers for almost all of its internal RPC protocols and file formats.
- Options
http://code.google.com/intl/zh-CN/apis/protocolbuffers/docs/proto.html#options
1. java_package
(file option): The package you want to use for your generated Java classes.
option java_package = "com.example.foo";
2. java_outer_classname
(file option): The class name for the outermost Java class (and hence the file name) you want to generate.
option java_outer_classname = "Ponycopter";
3. optimize_for
(file option): Can be set to SPEED
, CODE_SIZE
, or LITE_RUNTIME
.
option optimize_for = CODE_SIZE;
http://code.google.com/intl/zh-CN/apis/protocolbuffers/docs/reference/java-generated.html
- 根据反编译后的Java文件推导出proto文件
首先看看下面的proto文件生成的Java文件是什么样子的:
package tutorial; option optimize_for = LITE_RUNTIME; option java_package = "com.example.tutorial"; option java_outer_classname = "AddressBookProtos"; 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; optional bytes addressBytes = 6; } message AddressBook { repeated Person person = 1; }
枚举类型会生成Java中的枚举:
public enum PhoneType implements com.google.protobuf.Internal.EnumLite { MOBILE(0, 0), HOME(1, 1), WORK(2, 2), ; public static final int MOBILE_VALUE = 0; public static final int HOME_VALUE = 1; public static final int WORK_VALUE = 2; ... }
注意同时会生成一个以_VALUE作为后缀的常量。
下面的三个域生成的Java代码是什么样子呢?
required string name = 1;
required int32 id = 2;
optional string email = 3;
首先生成一个接口PersonOrBuilder,有下面的方法:
boolean hasName(); String getName(); boolean hasId(); int getId(); boolean hasEmail(); String getEmail();
然后生成Person类,实现接口PersonOrBuilder,同时,定义了下面的常量:
public static final int NAME_FIELD_NUMBER = 1; public static final int ID_FIELD_NUMBER = 2; public static final int EMAIL_FIELD_NUMBER = 3;
可以看出,都有_FIELD_NUMBER后缀。
可以从isInitialized()函数中看判断某个域是optional还是required。optional的域不会在isInitialized()中进行检查。
public final boolean isInitialized() { if (!hasName()) { return false; } if (!hasId()) { return false; } ... }
对于域是一个message而不是原始类型的情况,判断是optional还是required有些区别:
比如,对于如下的proto:
optional PhoneNumber mobile = 7; required PhoneNumber cell = 8;
对于的Java代码为:
if (!hasCell()) { memoizedIsInitialized = 0; return false; } if (hasMobile()) { if (!getMobile().isInitialized()) { memoizedIsInitialized = 0; return false; } } if (!getCell().isInitialized()) { memoizedIsInitialized = 0; return false; }
对于required message field, Java代码中会首先用一个if语句块hasXxx()判断,然后再用一个if语句块getXxx().isInitialized()进行判断,而对于optional message field,两个if语句块会嵌套一起。
在initFields()函数中查看具体有哪些fields,再结合XXX_FIELD_NUMBER一起分析。
判断extensions:
查看registerAllExtensions()函数。
通常是使用nested extensions,需要好好理解,其实很简单,只是写法有点绕:
http://code.google.com/apis/protocolbuffers/docs/proto.html#extensions
http://code.google.com/apis/protocolbuffers/docs/reference/java-generated.html#extension
下面的例子:
public static final int MAN_FIELD_NUMBER = 123; public static final com.google.protobuf.GeneratedMessageLite.GeneratedExtension< com.example.tutorial.AddressBookProtos.Person, com.example.tutorial.AddressBookProtos.Man> man = com.google.protobuf.GeneratedMessageLite .newSingularGeneratedExtension( com.example.tutorial.AddressBookProtos.Person.getDefaultInstance(), com.example.tutorial.AddressBookProtos.Man.getDefaultInstance(), com.example.tutorial.AddressBookProtos.Man.getDefaultInstance(), null, 123, com.google.protobuf.WireFormat.FieldType.MESSAGE); }
可以得知Man是Person的extension,并且field number是123.
LazyStringList对应 repeat string xxx = 1;
this change coming up in 2.4.0:
"""Added lazy conversion of UTF-8 encoded strings to String objects to improve
performance."""
发表评论
-
Sphinx - a tool that makes it easy to create intelligent and beautiful documenta
2012-07-04 13:44 1006http://sphinx.pocoo.org/ -
GNUStep
2012-06-04 16:45 1246http://www.gnustep.org/ T ... -
ProGuard
2012-04-10 21:34 933http://proguard.sourceforge.net ... -
The Go Programming Language
2012-04-10 09:43 1394http://golang.org/ packag ... -
eyes-free - Speech Enabled Eyes-Free Android Applications
2012-04-06 14:01 1126http://code.google.com/p/eyes-f ... -
LaTeX – A document preparation system
2012-03-28 13:34 1193http://www.latex-project.org/ ... -
Android Push Notification
2012-03-22 16:09 1271http://sourceforge.net/projects ... -
mytracks - MyTracks for Android
2012-03-20 10:10 1761http://code.google.com/p/mytrac ... -
MASF server of Google
2012-03-18 22:35 1599从下面Android代码可以得到一些有限的提示: http: ... -
maven设置HTTP代理
2012-03-16 14:52 5562http://maven.apache.org/ Apa ... -
GStreamer - open source multimedia framework
2012-03-15 19:46 1618http://gstreamer.freedesktop.or ... -
clementine-player - A cross-platform music player
2012-03-14 19:36 1139http://code.google.com/p/clem ... -
The speech energy endpointer implementation from Chrome
2012-03-14 19:26 1167http://src.chromium.org/svn/tru ... -
The Chromium Projects
2012-03-14 17:35 1185http://www.chromium.org/ ... -
企业级C++开发不得不提到的跨平台的开源库
2012-03-03 17:31 1350ACE http://www.cs.wustl.edu/~s ... -
FTP
2012-03-01 15:03 991http://filezilla-project.org/ ... -
What is Jansi
2012-02-20 15:32 1667http://jansi.fusesource.org/ ... -
AndroidAnnotations - 大大简化您的Android开发
2012-02-14 14:11 3709https://github.com/excilys/andr ... -
An Email Program for Sending SMTP Mail from a Command Line
2012-02-11 19:49 2166SendEmail is a lightweight, com ... -
The Java API to access Microsoft excel files
2012-02-10 14:49 1191http://poi.apache.org/spreads ...
相关推荐
标题中的"ProtocolBuffers-2.2.0-Source (1).tar.gz"指的是谷歌的Protocol Buffers(简称protobuf)的2.2.0版本源代码压缩包,它以.tar.gz格式打包,这是一种常见的Linux和macOS下的文件压缩方式。这个压缩包可能是...
Protocol Buffers是一种高效的数据序列化协议,由Google开发,常用于结构化数据的序列化,可以替代XML、JSON等格式,因为它更小、更快、更简单。 **描述详解:** 描述中提到"协议缓冲区模式",这指的是protobuf中...
Protocol Buffers(简称protobuf)是由谷歌公司开发的一种高效、灵活的数据序列化协议,用于在不同系统间进行数据交换。它提供了一种简洁、高效的二进制数据表示方式,使得数据能够在各种语言(如C++、Java、Python...
Protocol Buffers - Google's data interchange format Copyright 2008 Google Inc. https://developers.google.com/protocol-buffers/ This package contains a precompiled binary version of the protocol ...
Protocol Buffers(简称protobuf)是Google开发的一种高效、灵活的数据序列化协议,它允许开发者将结构化的数据序列化,便于存储、通信或者在各种数据处理系统之间交换数据。protobuf不仅独立于语言,还独立于平台,...
protobuf定义了一个结构化的消息格式,并提供了一组工具来生成各种编程语言的代码,使得应用程序可以轻松地创建和解析protobuf消息。同时,protobuf还支持消息的压缩和加密,以及版本兼容和升级等特性,使其在分布式...
协议缓冲区模式 没有废话用Javascript编写的架构解析器 npm install protocol - buffers - schema 用法 首先将以下文件另存为example.proto syntax = "proto2" ;...var schema = require ( 'protocol-buffers-s
Protocol Buffers - Google's data interchange format Copyright 2008 Google Inc. https://developers.google.com/protocol-buffers/ This package contains a precompiled binary version of the protocol ...
**Google Protocol Buffers**,简称Protobuf,是Google开发的一种数据序列化协议,它能够将结构化的数据序列化,可用于数据存储、通信协议等方面。它提供了比XML更小、更快、更简单的替代方案,可以用于各种编程语言...
Protocol Buffers(简称protobuf)是由Google开发的一种数据序列化协议,它允许开发者定义数据结构,并将这些数据结构高效地编码和解码为二进制格式,便于在网络间传输或者存储。protobuf的核心优势在于其小巧、高效...
Protocol Buffers是Google开发的一种数据序列化协议,用于结构化数据的序列化,可以视为一种跨平台、跨语言的数据交换格式。它允许开发者定义数据结构,然后生成代码以轻松地在各种数据流之间读写这些数据。Protocol...
Protocol Buffers are a way of encoding structured data in an efficient yet extensible format. Google uses Protocol Buffers for almost all of its internal RPC protocols and file formats. Latest ...
Google Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的...
Protocol Buffers 2.4.1 jar
lighttpd: fix /usr/lib/mod_cgi.so: undefined symbol: chunkqueue_written
"Protocol-Buffers-Swift-test" 是一个项目名称,表明这是一个关于使用 Protocol Buffers(谷歌的一种数据序列化协议)与 Swift 语言进行集成和测试的实践项目。"使用 Protocol Buffers 和 Swift 进行概念验证" 描述...
protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现,如:java、c#、c++、javascript、go 、python、ruby和php等,每一种实现都包含了相应语言的...
Protocol Buffers(简称protobuf)是由Google开发的一种数据序列化协议,它类似于XML和JSON,但更加高效、紧凑。protobuf提供了一种结构化的数据存储和通信方式,使得不同语言之间可以轻松地交换数据。在Java环境下...