• Protobuf简介 Protocol Buffer是google 的一种数据交换的格式,已经在Github开源,目前最新版本是3.1.0。它独立于语言,独立于平台。google 提供了多种语言的实现:Java、C#、C++、Go 和 Python,Objective-C,每...

    Protobuf简介

    Protocol Buffer是google 的一种数据交换的格式,已经在Github开源,目前最新版本是3.1.0。它独立于语言,独立于平台。google 提供了多种语言的实现:Java、C#、C++、Go 和 Python,Objective-C,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 XML 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

    说明

    • protobuf3.0.0以上才官方支持Objective-C,低于3.0.0的请忽略或使用第三方转换工具
    • 开发环境:32bit & 64bit iOS, 64bit OS X,Xcode7.0+
    • 基于性能原因没有使用ARC,但可以被ARC代码调用

    步骤

    1. 转换:将我们编写好的XXX.proto文件转成Objective C文件,也就是XXX.h和XXX.m文件,转换的工具是使用protoc这种二进制文件来生成的,这文件需要自己生成,稍后会介绍如何使用它来转换Objective-C文件
    2. 集成:如果在iOS项目中加入protobuf库以及步骤1生成的OC文件

    转换

    生成protoc

    如果没有装autoconf automake libtool需要先装这几个,这里使用brew来安装,在shell执行 brew install autoconf automake libtool即可,如果没有brew请自行先安装brew。 
    下载面向Objective-C的protobuf库,地址为(https://github.com/google/protobuf/releases),要下载对应Objective-C的版本比如 protobuf-objectivec-3.1.0.zip,解压。

    cd到下载的目录,依次执行:

    • $ ./autogen.sh
    • $ ./configure
    • $ make
    • $ make check
    • $ sudo make install

    再执行 
    - objectivec/DevTools/full_mac_build.sh

    执行完后会看到src目录下生成了protoc二进制文件

    使用protoc转换

    创建proto文件,比如Person.proto

    syntax = "proto3";
    
    message Person
    
    {
    
    int32 age = 1;
    
    string username = 2;
    
    string phone = 3;
    
    }

    需要注意的是要指明proto的语法规则是proto2还是proto3。 
    在src目录(protoc所在目录)执行

    protoc --proto_path=... --objc_out=... XXX.proto

    其中proto_path是我们创建的proto文件所在目录,objc_out为Objective-C文件输出路径,XXX.proto是我们创建的proto文件,可以一次转换多个proto文件,加在XXX.proto后面即可。

    举例:我们在src目录下新建两个文件夹,gen和protocols文件夹,gen为输出目录,protocols用于存放proto文件,将创建的Person.proto放在protocols文件夹下,执行命令

    protoc --proto_path=protocols --objc_out=gen protocols/Person.proto

    然后在gen文件夹下就会生成Person.pbobjc.h和Person.pbobjc.m文件。

    集成

    将生成的Ojective-C文件(上面例子的Person.pbobjc.h和Person.pbobjc.m)放到项目中,如果项目使用了ARC,要将.m(例子的Person.pbobjc.m)的Complier Flags设为-fno-objc-arc。(protobuf基于性能原因没有使用ARC)

    加入protobuf库,有两种方式

    • 第一种是使用CocoaPods集成

      • 使用CocoaPods集成,有一个现成的pod可以使用–Protobuf,可以pod search Protobuf搜索查看详情,pod内容为  
      platform :ios, '7.1'
      
      pod 'Protobuf', '~> 3.1.0

       

    • 需要注意的是 platform :iOS, ‘7.1’ 
      7.1及以上才能导入这个库,这种方式优点是操作简单,缺点是platform :ios, ‘7.1’ 要7.1或以上

    • 第二种是把相关文件拖入项目中。

      • 拖入相关文件到项目中,将objectivec文件夹下的所有的.h文件和.m文件(除了GPBProtocolBuffers.m)(GPB开头的那些文件)以及整个google文件夹add到项目中,如果项目中使用了ARC需要将以上所有.m文件的的Complier Flags设为-fno-objc-arc。这种方法的优点是灵活性强,没有7.1的束缚。缺点是操作麻烦点,如果用了ARC的话还要手动添加-fno-objc-arc(使用CocoaPods集成会自动添加),记得添加User Header Search Paths为$(PROJECT_DIR)/项目名/后接文件地址 不然头文件会报错

    简单使用

    直接上代码

    - (void)viewDidLoad {
    
    [super viewDidLoad];
    
    Person *person = [[Person alloc] init];
    
    person.age = 100;
    
    person.username = @"huang";
    
    person.phone = @"10086";
    
    NSData *data = [person data];
    
    Person *p = [Person parseFromData:data error:nil];
    
    NSLog(@"person:%@",p);
    
    }

     

    展开全文
  • 【caffe源码】caffe.proto

    2018-12-17 09:27:23
    跟着m哥调了了一段时间代码,断断续续地初步用了一下caffe,但是始终有点若即若离的感觉,偶然看到了知乎的一个回答 https://www.zhihu.com/question/27982282/answer/80242005 ,决定开始系统地看一下caffe的源码,...

    跟着m哥调了了一段时间代码,断断续续地初步用了一下caffe,但是始终有点若即若离的感觉,偶然看到了知乎的一个回答 https://www.zhihu.com/question/27982282/answer/80242005 ,决定开始系统地看一下caffe的源码,在此稍作整理备忘及供有缘人参考。今后的几篇源码系列的文章大概以这篇文章为框架陆续写下去。

    我们知道caffe中的网络和优化器都是以proto协议的文件储存的。简单来说proto可看作用于数据收发的、一种优化版的xml。官网见此处,科普见此处

    Play with proto

    首先从 https://www.cnblogs.com/gongxijun/p/7010641.html 中的一个例子开始吧。
    编写caffe.proto文件,这个文件相当于制定了一种传输数据的协议,供发送端和接收端使用:

    //caffe.proto
    syntax = "proto2";		//指定协议proto2或proto3
    package caffe;
    
    message student
    {
       required int32 age = 1; 	//ID required 表示必要字段
       required string name = 2; 	//str 必要字段
       optional int32 grade = 3; 	//optional field 可选字段,可以有无,最多b   
    }
    

    将proto转为cpp代码供收发端调用:

    protoc -I=. --cpp_out=. ./caffe.proto
    

    运行后可以看到生成caffe.pb.h和caffe.pb.cc编写读写文件caffeRead.cpp:

    //caffeRead.cpp
    #include"caffe.pb.h"
    #include<iostream>
    #include<ios>
    
    using namespace std;
    
    void InfoStudents(const caffe::student & stu){
        cout<< "student info:"<<endl;
        cout<<"name: "<<stu.name()<<endl;
        cout<<"age: "<<stu.age()<<endl;
        cout<<"grade: "<<stu.grade()<<endl;
    }
    
    int main(void)
    {
       caffe::student stu;
       stu.set_age(18);
       stu.set_name("gongxijun");
       stu.set_grade(146);
       InfoStudents(stu);
       return 0;
    }
    

    编译cc文件并执行:

    g++ caffeRead.cpp -o caffeReader caffe.pb.cc -I /usr/local/protobuf/include -L /usr/local/protobuf/lib -lprotobuf -pthread 
    

    看到输出:

    student info:
    name: gongxijun
    age: 18
    grade: 146
    

    如果加入socket等收发机制,将写过程和读过程分离,则可以实现设备间的通信。

    proto语法

    同样基于以上的例子,首先syntax指定了语法标准,caffe是基于proto2的,后面我们默认以proto2为准。根据这里package的作用是指定class的namespace,防止class名的冲突。后面每个message相当于一个class,proto文件里面可以同时有多个message(但是官方不推荐包含太多,因为会造成dependency bloat)。上面的student message中有3个fields(key-value对),每个field有rule、type、name和unique number。

    1. rule有3中形式,required表示每条打包后的信息(message实例)必须包含1个此类field,0/1个optional,若干个(包括0)repeated。
    2. type是一些可以和c++(或其他调用接口语言)中的数据类型相转化的数据类型,如int32等,具体见这里,也可以是某个message的type,或者预定义枚举类型enum中的一个。
    3. unique number(ID)可选范围是[1,2291][1, 2^{29}-1],其中[1,15][1,15]占用1个字节,[16,2047][16, 2047]占用2个字节,以此类推。所以应该将常用的field编成短码,用于在二进制数据中作为key,具体的value采用了msb标记扩展字节,官方文档详细介绍了译码方式,好奇心重的读者可以推一下,这部分内容不详细了解也不影响基本使用,所以这里不再赘述了。(doc已经很详细了,但是这篇文章大看一眼也还不错,我没仔细看,仅供参考吧。)

    caffe.proto的组成

    数据协议

    message BlobShape {
    message BlobProto {
    message BlobProtoVector {
    message Datum {
    

    其中V1LayerParameter和V0LayerParameter用于旧版,现在已经弃用,故后文不再赘述。
    其他message的一些调用结构如下所示:

    message SolverState {
    message SolverParameter {
       |---message NetParameter {
       |		 \
       |		message NetState {
       |		/
       |---LayerParameter {
       			|-message NetStateRule {
       			|-message ParamSpec {
       			|-其他用于layer的 message
       					|-message FillerParameter {(初始化赋值)
    

    具体的message的用途到后面变用边学吧,目前可以参考 https://blog.csdn.net/weixin_39970417/article/details/80825601

    展开全文
  • Protobuf简介: Protocol Buffer是google 的一种数据交换的格式,已经在Github开源,目前最新版本为3.4.0 说明: protobuf3.0.0以上才... 64bit iOS, 64bit OS X,Xcode7.0+ 基于性能原因没有使用ARC,但可以被...

    Protobuf简介:

    • Protocol Buffer是google 的一种数据交换的格式,已经在Github开源,目前最新版本为3.4.0

    说明:

    • protobuf3.0.0以上才官方支持Objective-C,低于3.0.0的请忽略或使用第三方转换工具
    • 开发环境:32bit & 64bit iOS, 64bit OS X,Xcode7.0+
    • 基于性能原因没有使用ARC,但可以被ARC代码调用
       

    配置环境:

    • 如果没有brew请自行先安装brew
    • 如果没有装 autoconf automake libtool需要先安,这里使用brew来安装,在shell执行 brew install autoconf automake libtool即可
    • 下载的protobuf库,官网地址:https://github.com/protocolbuffers/protobuf(以master为例,将来oc项目里使用的代码对应存在于 /protobuf-master/objectivec 路径)

    cd到下载的目录,依次执行:

    • $ ./autogen.sh
    • $ ./configure
    • $ make
    • $ make check(本人此步骤执行报错,忽略后无影响)
    • $ sudo make install
    • $ - objectivec/DevTools/full_mac_build.sh 执行完后会看到src目录下生成了protoc二进制文件(本人此步骤执行报错,忽略后无影响)

    此时,/protobuf-master/src 路径下多了一个可执行文件:protoc 

    进入到 src 对应的目录,执行  protoc --proto_path=要转化的proto文件路径 --objc_out=要输出的oc文件路径 要转化的proto文件名如XXX.proto

    目标文件就会多两个以  pbobjc.h 和  .pbobjc.m 后缀的文件,至此,文件转化完成!!!

     

     

     

    展开全文
  • 这次搭建iOS的ProtocolBuffer编译器和把*.proto源文件编译成*.pbobjc.h 和 *.pbobjc.m文件时,碰到不少问题! 搭建pb编译器到时没有什么问题,只是在把*.proto文件编译出来后,我用cocoaPods集成ProtocolBuffers...

     这次搭建iOS的ProtocolBuffer编译器和把*.proto源文件编译成*.pbobjc.h 和 *.pbobjc.m文件时,碰到不少问题!

    搭建pb编译器到时没有什么问题,只是在把*.proto文件编译出来后,我用cocoaPods集成ProtocolBuffers到自己项目,

    cocoaPods集成的时候,我尝试了两个库,一个是:

    https://github.com/google/protobuf.git,

    另外一个是:

    https://github.com/alexeyxo/protobuf-objc.git

    但是运行时都一直报错通过:

    一会报ProtocolBuffer库文件找不到;

    一会报版本不对:This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources ;

    一会报属性数据格式不存在,不匹配。

     

       最后不得已只好放弃CocoaPods, 直接把从https://github.com/google/protobuf下载下来的库拖进工程里面,这样才OK了!

    简单说下我这边pb编译器的安装过程,和编译后的使用demo:

     

    一、环境安装:pb编译器的安装

         1、从https://github.com/google/protobuf/releases下载protocolBuffer对应版本编译器包,比如目前的对应的objc最新版本

        下载地址为:https://github.com/google/protobuf/releases/download/v3.1.0/protobuf-objectivec-3.1.0.zip


      2、解压包,假设解压后的文件夹名为: protobuf-objectivec-3.1.0, 
        打开终端,进入文件夹protobuf-objectivec-3.1.0, 依次执行以下命令:

    ./configure
    make
    make check
    sudo make install

      如果编译顺利的话,便可以使用protoc命令了,以后便可以用这个命令将.proto文件转换为不同语言的源代码文件。

     

    二、创建新项目,导入pb库,编写proto文件编译,使用过程

          1、从https://github.com/google/protobuf.git下载源码,解压,里面有支持不同语言的版本源码,

      我们只需要里面的支持objc的文件夹名为:objectivec,如图:

      

     

      2、新建一个工程命名为Tan_ProtocolBuffer,创建一个文件夹,假设命名为:protocolbuf, 把第一步的pb源码复制到此文件夹中:

      

     

      3、使用Xcode打开工程,点击左下角“+”, 引用protocolBuffer源文件到工程中

      (源文件里面有两个工程配置文件:ProtocolBuffers_iOS.xcodeproj和ProtocolBuffers_OSX.xcodeproj,引用ProtocolBuffers_iOS.xcodeproj就好)

          

       

      4、选中工程: targets —>  Build Phases  —>  Link Binary With Libraries, 引用源码静态库文件:libProtocolBuffers.a

      

     

      5、在工程设置搜索静态库的头文件(pb文件在protocolbuf文件夹里面):

       targets —>  Build Setting  —>  Search Paths  —> Header Search Paths, 写入:$(PROJECT)/protocolbuf 

      

     

      

      6、编写测试文件*.proto,比如新建一个文件Person.proto, 按照官方标准语法https://developers.google.com/protocol-buffers/ 编写通用代码,
      写好后在终端进入该Person.proto文件所在目录,使用protoc命令:protoc *.proto --objc_out=../Pro_out 进行编译。
      把Person.proto文件编译成Person.pbobjc.h和Person.pbobjc.m, 生成的文件在Pro_out文件夹里面。
      如果Person.proto源文件有语法问题,编译时会报错;当编译时什么提示都没有,表示编译成功:
      将编译好的*.pbobjc.h和*.pbobjc.m拖入工程中,因为不支持arc, 所以需要在*.pbobjc.m设置-fno-objc-arc, 然后就可以使用了。

      截图如下:  

        

     

        

     

               

     

       

     

         

     

     

      7、编写测试代码,使用Person类进行数据序列化和反序列:

      

    示例demo下载地址:https://github.com/xiaotanit/Tan_ProtocolBuffer

     

    原文链接:http://www.cnblogs.com/tandaxia/p/6181534.html 

    展开全文
  •  protocol buffer 是 google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了三种语言的实现:java、c++ 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,...

     转自:http://blog.csdn.net/liliangchw/article/details/8525834     liliang的专栏

    1,下载ProtocolBuffer包,并按照包中根目录下README.txt安装。

    http://code.google.com/intl/zh-CN/apis/protocolbuffers/

    当前最新版本2.4.1

    最后make install后,会生成编译器protoc,并拷贝到/usr/local/bin目录下。

     

    2,下载Objective-C compiler for ProtocolBuffer。

    目前有两种类型的实现。

    一个针对ProtocolBuffer2.2做修改,使最后生成的.proto文件编译器(protoc)支持Objective-C类型的文件输出。

    它在这里:http://code.google.com/p/metasyntactic/wiki/ProtocolBuffers

    另一个针对ProtocolBuffer2.3推出的plugin模式编写插件,以插件方式支持Objective-C类型的文件输出。

    它在这里:https://github.com/booyah/protobuf-objc

    我选用第二种方式,这也是Google推荐的方式。

    git clone https://github.com/booyah/protobuf-objc.git

    默认会在当前运行目录下创建protobuf-objc目录。进入该目录,并执行:

    ./autogen.sh

    ./configure

    make

    make install

    最终生成的插件名字为protoc-gen-objc,会被安装到/usr/local/bin/目录下。

     

    3,测试.proto文件编译。

    随便写一个test.proto文件,并编译该文件。命令是:

    protoc –objc_out=/Output/Directory/ test.proto

    protoc会自动在/usr/local/bin/目录下寻找名为”protoc-gen-objc”的插件,并使用该插件编译.proto文件,最终生成两个文件:

    test.pb.h

    test.pb.m

    这个步骤通过后,说明ProtocoBuffer Compiler for Objective-C可以正常工作了。

     

    4,在Xcode4.3.1中使用ProtocolBuffer

    将步骤2中protobuf-obj/src/runtime/Classes目录导入到Xcode项目中,导入时,选中”Copy items into destination group‘s folder(if needed)“。

    导入位置选择项目根目录。导入完毕后,项目根目录下将会出现Classes目录。将该目录改名为ProtocolBuffers(注意最后的s):

    mv Classes ProtocolBuffers

    修改项目属性中”Build Setting——>Header Search Pathes”,将项目根目录“.”添加到头文件搜索路径中去。

    这样ProtocolBuffer for Objective-C的工作环境就配置好了。

    5,使用

    将步骤3中编译输出的test.pb.h和test.pb.m添加到项目中,就可以直接使用了。

    展开全文
  • 1:安装编码器 :(编译.proto文件 生成.h .m 文件) 终端输入 :protoc *.proto --objc_out=../Pro_out 2 项目中 导入protobuf 库, (可以github 上下载 也可以使用 pods 导入) 3 编码 或者 序列化(把 ...
  • 让我们一起打开下面这个链接 ... 在github上有protobuf-objc,其中的...然后利用protoc,也就是protobuf的编译器可以编译.proto文件,生成一些.h和.m文件。 在移动App中,使用protobuffer可以做储存,可以做网络
  • protobuf java中的使用

    2015-03-26 15:43:57
    Protobuf在Java中的简单使用   1. 在Java中使用protobuf需要jar包,下载...另外需要protoc.exe来编译proto文件。 2. 新建一个msg.proto文件: package com.test.learn;   option java_package = "com.t
  • (1)Protobuf是什么? Protobuf 即 google protocol buffer 是一种数据封装格式协议,是google推出 的一种语言无关、平台无关、扩展性好的用于通信协议、数据存储的结构化数据串行化方法。...iOS平台上我们常...
  • 1.下载protobuf-ioshttps://github.com/mingchen/protobuf-ios,保存到本地目录protobuf 2.打开protobuf目录,编译protobuf,具体步骤见...3.编写addressbook.proto  // See README.txt for
  • iOS中tcp+protobuf

    2017-08-28 14:10:19
    iOS中 tcp+protobuf实现网络通讯。从安装到简单实用
  • 在.proto文件中定义消息(message)格式。 使用protobuf的编译器编译.proto文件成为相应的语言代码。 使用对应语言的protobuf API读写消息。 在这里,我直接使用了官方的示例,之后打算使用grpc简单转写这个示例...
  • 项目目录: protocol_def、userPreference_def 是protobuf协议文件 start可执行文件源码: #!/bin/sh # # An example hook script to prepare a packed repository for use over # dumb transports. ...
  • /* class类 / 使用Class代替struct objc_class * */ typedef struct objc_class *Class; typedef struct objc_object { Class isa; } *id;struct objc_class { Class isa; Class super_class ;...
  • Protobuf3 使用..

    2017-06-16 09:32:42
    Protobuf3 相关连接: Google-protobuf(需要翻墙):https://developers.google.com/protocol-buffers/ Protobuf on github:https://github.com/google/protobuf Git上的资源:...Pro
  • 一.常用命令 ... touch xxxx.proto (用命令创建xxxx.proto文件) vi xxxx.proto (使用vi或vim编辑该文件,或直接通过xcode编辑) 例1. 编辑xxxx.proto syntax = 'proto3' message xxxx{  s...
  • Protobuf3 google protobuf

    2016-01-08 18:53:45
    Protocol Buffers是一个跨语言、跨平台的具有可扩展机制的序列化数据工具...Google说protobuf是smaller,faster,simpler,我们使用google规定的proto协议定义语言,之后使用proto的工具对代码进行“编译”,生成对应的
  • 原文地址:...这次搭建iOS的ProtocolBuffer编译器和把.proto源文件编译成.pbobjc.h 和 .pbobjc.m文件时,碰到不少问题! 搭建pb编译器到时没有什么问题,只是在把.pro...
1 2 3 4 5 ... 20
收藏数 1,559
精华内容 623