Protocol Buffers (ProtocolBuffer/ protobuf )是Google公司开发的一种数据描述语言,相似于XML可以将结构化数据序列化,可用于数据存储、通讯协议等方面。现阶段支持C++、JAVA、Python等三种编程语言。html
https://github.com/golang/protobufios
我使用这个方式并无成功,使用方式2git
git clone https://github.com/google/protobuf.git
$ brew install automake $ brew install libtool //有些还说须要这个 $ brew install autoconf
//首先cd 到git clone 的protobuf/ 目录下,运行 ./autogen.sh $ ./autogen.sh
$ ./configure $ make check $ make $ make install
Mac上安装Protobufgithub
google protobuf ios开发使用golang
How To Install Protobuf Building the Objective-C Protobuf compiler Check if you have Homebrew brew -v If you don't already have Homebrew, then install it ruby -e $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install) Install the main Protobuf compiler and required tools brew install automake brew install libtool brew install protobuf (optional) Create a symlink to your Protobuf compiler. ln -s /usr/local/Cellar/protobuf/2.6.1/bin/protoc /usr/local/bin Clone this repository. git clone https://github.com/alexeyxo/protobuf-objc.git Build it!
brew -v
ruby -e $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)
brew install automake brew install libtool brew install protobuf
4.安装工程ubuntu
git clone https://github.com/alexeyxo/protobuf-objc.git //cd 进入protobuf-objc ./build.sh
从github下载protobuf-objc这个工程,build脚本里面作的是编译ruby
注意:编译工程过程当中,有可能会出现错误。别慌!看编译错误的提示。通常错误只是由于环境变量和路径没有配置好,少了一些东西,例如少了编译protobuf这个工程的依赖库,按照提示添加路径便可curl
有了工程之后,咱们就能够开始测试一下怎么用protobuf了编程语言
protobuffer 有proto3 和 proto2 的区别,由于个人项目里必须使用proto2,因此须要另外处理。
编译命令:
protoc --go_out=. *.proto
Protobuf 的 proto3 与 proto2 的区别
这是一篇学习笔记。在粗略的看了 Protobuf 的文档中关于 proto2 和 proto3 的说明后,记录下了几点 proto3 区别于 proto2 的地方。
总的来讲,proto3 比 proto2 支持更多语言但 更简洁。去掉了一些复杂的语法和特性,更强调约定而弱化语法。若是是首次使用 Protobuf ,建议使用 proto3 。
1.在第一行非空白非注释行,必须写:syntax = "proto3";
2.字段规则移除了 “required”,并把 “optional” 更名为 “singular”;
在 proto2 中 required 也是不推荐使用的。proto3 直接从语法层面上移除了 required 规则。其实能够作的更完全,把全部字段规则描述都撤销,原来的 repeated 改成在类型或字段名后加一对中括号。这样是否是更简洁?
3.语言增长 Go、Ruby、JavaNano 支持;
4.移除了 default 选项;
在 proto2 中,可使用 default 选项为某一字段指定默认值。在 proto3 中,字段的默认值只能根据字段类型由系统决定。也就是说,默认值所有是约定好的,而再也不提供指定默认值的语法。
在字段被设置为默认值的时候,该字段不会被序列化。这样能够节省空间,提升效率。
但这样就没法区分某字段是根本没赋值,仍是赋值了默认值。这在 proto3 中问题不大,但在 proto2 中会有问题。
好比,在更新协议的时候使用 default 选项为某个字段指定了一个与原来不一样的默认值,旧代码获取到的该字段的值会与新代码不同。
另外一个重约定而弱语法的例子是 Go 语言里的公共/私有对象。Go 语言约定,首字母大写的为公共对象,不然为私有对象。因此在 Go 语言中是没有 public、private 这样的语法的。
5.枚举类型的第一个字段必须为 0 ;这也是一个约定。
6.移除了对分组的支持;
分组的功能彻底能够用消息嵌套的方式来实现,而且更清晰。在 proto2 中已经把分组语法标注为『过时』了。此次也算清理垃圾了。
7.旧代码在解析新增字段时,会把不认识的字段丢弃,再序列化后新增的字段就没了;
在 proto2 中,旧代码虽然会忽视不认识的新增字段,但并不会将其丢弃,再序列化的时候那些字段会被原样保留。
我以为仍是 proto2 的处理方式更好一些。能尽可能保持兼容性和扩展能力,或许实现起来也更简单。proto3 如今的处理方式,没有带来明显的好处,但丢掉了部分兼容性和灵活性。
8.移除了对扩展的支持,新增了 Any 类型;
Any 类型是用来替代 proto2 中的扩展的。目前还在开发中。
proto2 中的扩展特性很像 Swift 语言中的扩展。理解起来有点困难,使用起来更是会带来很多混乱。
相比之下,proto3 中新增的 Any 类型有点想 C/C++ 中的 void* ,好理解,使用起来逻辑也更清晰。
9.增长了 JSON 映射特性;
语言的活力来自于与时俱进。当前,JSON 的流行有其充分的理由。不少『现代化』的语言都内置了对 JSON 的支持,好比 Go、PHP 等。而 C++ 这种看似保罗万象的学院派语言,因循守旧、故步自封,以至于现出了式微的苗条。
升级,新版本的已经有了
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
Building Go in performance tests suite is broken
2.mac 10.12.1 安装出现问题(按照这个方法未解决问题)
./configure CPPFLAGS="-Wno-deprecated-declarations"