精华内容
下载资源
问答
  • Protobuf

    2020-07-11 00:30:42
    Linux(centos)下编译Protobuf:在root下进行,如果没有root权限,make install会无法mkdir 下载:git clone https://github.com/protocolbuffers/protobuf.git 或者:官方github发布版本链接:...

    Linux(centos)下编译Protobuf:在root下进行,如果没有root权限,make install会无法mkdir

    下载:git clone https://github.com/protocolbuffers/protobuf.git

    或者:官方github发布版本链接:https://github.com/protocolbuffers/protobuf/releases

    解压:根据自己下载的版本调整

    tar zxvf protobuf-cpp-3.12.3.tar.gz

    编译:可以直接./configure,生成的protoc在/usr/local/bin目录下,后面会用到

    
    cd protobuf
    
    ./configure --prefix=/usr/local/protobuf
    
    make
    
    make check
    
    make install
    

    安装成功,查看版本号:

    protoc --version

    编写proto文件

      1 syntax = "proto3";
      2 package Im;
      3 message Content
      4 {
      5         optional int32  id = 1;
      6         optional string str = 2;
      7         optional int32  opt = 3;
      8 }
    

    生成.cc&.h文件

    /usr/local/bin/protoc -I=./ --cpp_out=./ Im.proto

    报错:

    Im.proto: This file contains proto3 optional fields, but --experimental_allow_proto3_optional was not set.

    重新编译

    
    /usr/local/bin/protoc --experimental_allow_proto3_optional -I=./ --cpp_out=./ Im.proto

     

    展开全文
  • protobuf

    2020-05-12 19:55:53
    错误: protoc --gogofast_out=. *.proto github.com/gogo/protobuf/gogoproto/gogo.proto: File not found. api.proto:5:1: Import "github.com/gogo/protobuf/gogoproto/gogo.proto" was not found or had errors.

    错误:

    protoc --gogofast_out=. *.proto
    github.com/gogo/protobuf/gogoproto/gogo.proto: File not found.
    api.proto:5:1: Import "github.com/gogo/protobuf/gogoproto/gogo.proto" was not found or had errors.
    
    展开全文
  • ProtoBuf

    千次阅读 2019-11-24 23:41:19
    为解决这些问题,Google提供了ProtoBuf ProtoBuf Google发布的开源项目,全程Goole Protocol Buffers。 是一种高效的结构化数据存储方式,可以用来序列化。很适合做数据存储和RPC的数据交换格式。 使用...

    编码和解码


    1. 数据在网络中的传输都是以二进制字节码数据,在发送时需要编码,接收时需要解码。
    2. codec由两部分组成,decoder(解码器)和 encoder(编码器)

    Netty的编码和解码


    Netty提供的编码器:

    • StringEncoder
    • ObjectEncoder

    Netty提供的解码器:

    • StringDecoder
    • ObjectDecoder

    Netty自带的编码解码器,底层使用的时Java的序列化技术,Java的序列化技术效率不高,而且存在以下问题;

    • 不能跨语言,Server和Client都必须是Java
    • 序列化后体积太大,是二进制编码的5倍多
    • 性能太低

    为解决这些问题,Google提供了ProtoBuf

    ProtoBuf


    Google发布的开源项目,全程Goole Protocol Buffers。
    是一种高效的结构化数据存储方式,可以用来序列化。很适合做数据存储和RPC的数据交换格式。

    使用protoBuf的实例:

    1. 下载ProtoBuf
    2. 项目导入protoBuf
    		<dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-java</artifactId>
                <version>3.6.1</version>
            </dependency>
    
    1. 编写proto文件
      Student.proto
    syntax="proto3"; // 声明版本
    option java_outer_classname="StudentPOJO"; //指定外部类
    message Student{
        int32 id=1;
        string name=2;
    }
    
    1. 使用protoc.exe生成Java文件
    protoc.exe --java_out=. Student.proto
    
    1. 编写客户端处理器和服务端处理器
      ClientHandler
    	// 在管道激活时发送一个Student对象
    	@Override
        public void channelActive(ChannelHandlerContext ctx) throws Exception {
            // 发送一个student对象到服务器
            // Student时StudentPOJO的内部类
            StudentPOJO.Student student = StudentPOJO.Student.newBuilder().setId(10).setName("张三").build();
            ctx.writeAndFlush(student);
        }
    

    ServerHandler

    	@Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        	// 强转即可使用
            StudentPOJO.Student student = (StudentPOJO.Student) msg;
            System.out.println(student.getId() + student.getName());
        }
    

    服务端和客户端分别添加解码器和编码器:

    Server:

    // 指定解码器,并指定对哪种对象解码
    pipeline.addLast(new ProtobufDecoder(StudentPOJO.Student.getDefaultInstance()));
    //添加自定义Handler
    pipeline.addLast(new ServerHandler());
    

    Client:

    // 添加编码器
    pipeline.addLast(new ProtobufEncoder());
    //添加自定义的Handler
    pipeline.addLast(new ClientHandler());
    
    1. 先后启动Server、Client

    服务器控制台打印:

    10张三
    

    成功接收到客户端发送的对象。


    虽然成功接收到Student对象,但如果想要发送其他对象则又需要编写proto文件,着实麻烦。

    解决办法
    编写proto文件,使用一个message来管理其他的message。在管理的message中,添加一个标识,用于标识发送过来的是哪一个的类的对象。

    实例如下:

    syntax = "proto3";  // 指定版本
    option optimize_for = SPEED; // 加快解析
    option java_package = "com.xing.netty.codec2"; //指定包位置
    option java_outer_classname = "MyDataInfo"; //外部类名
    // protoBuf可以使用message管理其他的message
    message MyMessage{
    
        // MyMessage的第一个属性,用data_type来标传的是哪一个枚举类型
        DataType data_type = 1;
    
        // 每次只能有一个枚举类型,节省空间
        oneof dataBody{
            Student student = 2;
            Worker worker = 3;
        }
    
    }
    
    // 枚举类型
    enum DataType{
        // enum中编号从0开始
        StudentType = 0;
        WorkType = 1;
    }
    
    message Student{
        // Student类的属性
        int32 id = 1;
        string name = 2;
    }
    
    message Worker{
        // Worker类的属性
        int32 age = 1;
        string name = 2;
    }
    
    

    生成MyDataInfo.java文件。

    Server添加MyDataInfo的解码器:

    // 指定解码器,并指定对哪种对象解码
    pipeline.addLast(new ProtobufDecoder(MyDataInfo.MyMessage.getDefaultInstance()));
    pipeline.addLast(new ServerHandler());
    

    经过测试可以发送Student和Worker对象。

    展开全文
  • protobuf 3.5 java使用介绍(一)

    万次阅读 2017-12-17 17:08:03
    protobuf 3.5 java使用介绍(一)网上大多的资料都是老版本的protobuf例子,正好用到了这个技术,我就把protobuf 3.5的使用方法记录一下,重点写了使用方法以及注意事项。proto描述文件的编写 语法 3.5的语法跟以前...

    网上大多的资料都是老版本的protobuf例子,正好用到了这个技术,我就把protobuf 3.5的使用方法记录一下,重点写了使用方法以及注意事项。

    proto描述文件的编写

    • 语法
      3.5的语法跟以前的protobuf语法有很大的变化,详细的可以参考官方文档,
      地址:https://developers.google.com/protocol-buffers/docs/proto3
      这里有一个中文翻译的文档
      地址:http://blog.csdn.net/u011518120/article/details/54604615

      重点注意的地方有这么几点:句法申明、数据类型

    • 例子

    syntax = "proto3";
    
    message gps_data {
        int64 id = 1;
    	string terminalId = 2;
    	string dataTime = 3;
    	double lon = 4;
    	double lat = 5;
    	float speed = 6;
    	int32 altitude = 7;
    	int32 locType = 8;
    	int32 gpsStatus = 9;
    	float direction = 10;
    	int32 satellite = 11;
    }
    
    

    注意:
    * 顶部必须申明句法的版本号,如果不申明,则默认是2.0的语法。
    * 下面Message节里面的字段就是业务需要的各个字段了,等号后面的数字是序号,必须指定。在3.5版本中不用指定required、等关键字了。
    * gps_data 的名称格式与为生成的java文件的名称是有关系的,如果加入了下划线,则默认生成的是GpsData 这个驼峰格式的名称。当然你也可以在文件里自定义java文件的名称
    如下:

    option java_outer_classname = "BatteryData";
    

    但是,生成的java代码中的的builder还是按照默认格式来生成的,所以,建议大家就直接按照默认规则来设计即可。
    * 此外,还可以指定改java代码的包路径,命令如下:

    option java_package = "com.yjgis.test"; 
    

    但是这里不建议使用这个功能,因为包路径会写入到生成的代码中,一旦,代码进行重构的时候,修改起来会很麻烦,还不如直接把包路径这种功能交给ide来完成

    JAVA代码的生成

    • 生成JAVA模型的命令
      在命令行工具中敲入下面的命令
    protoc -I=src/main/resource/proto 
    --java_out=src/main/java src/main/resource/proto/protobuf.proto
    

    说明:
    -I 后面是proto文件所在的目录,
    –java_out 后面是生成java文件存放地址
    最后一行是proto文件的名称,可以写绝对地址,也可以直接写proto文件名称

    生成的代码如下所示
    这里写图片描述
    绿色即是上面文件生成的代码。

    在JAVA中如何使用生成的数据模型

    把生成的这个java类拷贝到工程,如下图:
    这里写图片描述

    主要需要使用的对象就是绿色方框内的,下面,我们来写一些代码

    • 测试代码
      有如下三个功能即可满足在业务中的需要了,如下:
      • 使用java代码生成一个数据模型
      • 把模型转换为二进制数据流
      • 把二进制数据流转成java对象

    首先在测试工程pom里增加依赖

    pom:
    
    <dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java</artifactId>
        <version>3.5.0</version>
    </dependency>
    
    JAVA代码:
    
    import com.google.protobuf.InvalidProtocolBufferException;
    
    public class TestGpsProtobuf {
        public static void main(String[] args) {
            System.out.println("===== 构建一个GPS模型开始 =====");
            GpsData.gps_data.Builder gps_builder = GpsData.gps_data.newBuilder();
            gps_builder.setAltitude(1);
            gps_builder.setDataTime("2017-12-17 16:21:44");
            gps_builder.setGpsStatus(1);
            gps_builder.setLat(39.123);
            gps_builder.setLon(120.112);
            gps_builder.setDirection(30.2F);
            gps_builder.setId(100L);
    
            GpsData.gps_data gps_data = gps_builder.build();
            System.out.println(gps_data.toString());
            System.out.println("===== 构建GPS模型结束 =====");
    
            System.out.println("===== gps Byte 开始=====");
            for(byte b : gps_data.toByteArray()){
                System.out.print(b);
            }
            System.out.println("\n" + "bytes长度" + gps_data.toByteString().size());
            System.out.println("===== gps Byte 结束 =====");
    
            System.out.println("===== 使用gps 反序列化生成对象开始 =====");
            GpsData.gps_data gd = null;
            try {
                gd = GpsData.gps_data.parseFrom(gps_data.toByteArray());
            } catch (InvalidProtocolBufferException e) {
                e.printStackTrace();
            }
            System.out.print(gd.toString());
            System.out.println("===== 使用gps 反序列化生成对象结束 =====");
    
        }
    }
    

    运行一下:

    Connected to the target VM, address: '127.0.0.1:59012', transport: 'socket'
    ===== 构建一个GPS模型开始 =====
    id: 100
    dataTime: "2017-12-17 16:21:44"
    lon: 120.112
    lat: 39.123
    altitude: 1
    gpsStatus: 1
    direction: 30.2
    
    ===== 构建GPS模型结束 =====
    ===== gps Byte 开始=====
    810026195048495545495045495532495458504958525233-707312243794644157-76-56118-66-113676456172185-102-103-1565
    bytes长度50
    ===== gps Byte 结束 =====
    ===== 使用gps 反序列化生成对象开始 =====
    id: 100
    dataTime: "2017-12-17 16:21:44"
    lon: 120.112
    lat: 39.123
    altitude: 1
    gpsStatus: 1
    direction: 30.2
    ===== 使用gps 反序列化生成对象结束 =====
    

    如何快速的进行json格式化

    我们在使用protobuf的时候,有些场景是需要快速把protobuf生成的对象转成json的,protobuf提供了很方便的方法来实现这个功能。但是这个功能并不包含在核心包里,需要依赖protobuf的工具包。
    代码如下:

    pom:
    <dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java-util</artifactId>
        <version>3.5.0</version>
    </dependency>
    
     System.out.println("===== 使用gps 转成json对象开始 =====");
    
     String jsonFormatM = "";
     try {
         jsonFormatM = JsonFormat.printer().print(gd);
     } catch (Exception e) {
         e.printStackTrace();
     }
    
     System.out.println(jsonFormatM.toString());
     System.out.println("json数据大小:" + jsonFormatM.getBytes().length);
     System.out.println("===== 使用gps 转成json对象结束 =====");
    
    

    执行结果:

    ===== 使用gps 转成json对象开始 =====
    {
      "id": "100",
      "dataTime": "2017-12-17 16:21:44",
      "lon": 120.112,
      "lat": 39.123,
      "altitude": 1,
      "gpsStatus": 1,
      "direction": 30.2
    }
    json数据大小:145
    ===== 使用gps 转成json对象结束 =====
    
    

    可以看到protobuf数据大小是json的1/3,如果数据模型更复杂或者数据量更大,优势还会更加明显。

    代码下载地址

    问题

    上面,我们学会了protobuf在java中的基本用法,那么思考几个问题:

    • 通常我们在数据模型中有可能会出现数组格式,而数组里面是一个其他的模型,这个怎么来做?
    • 构建数据消息的时候,通常会有一个头,一个体;根据头中定义的数据类型不同,体里面的数据模型也不相同,这个又该怎么处理。

    上面两个问题,在稍后的文章里会跟大家分享。

    下一篇:

    展开全文
  • protobuf安装包

    2018-02-07 14:41:07
    https://github.com/google/protobuf https://github.com/google/protobuf protobuf安装包
  • protobuf 3.6.1

    2018-10-01 21:45:50
    protocolbuffer (以下简称PB) 是google 的一种数据交换的格式,它独立于语言,独立于平台。...由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信...protobuf-3.6.1.tar.gz
  • Mac安装protobuf 流程

    万次阅读 2018-07-13 18:08:16
    1.brew安装protobuf 1.安装brew ruby -e &amp;amp;amp;quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)&amp;amp;amp;quot; 2.使用brew安装protoc brew ...
  • protobuf 3.5.1

    2018-04-29 19:45:31
    protobuf-all-3.5.1.tar.gz protobuf-cpp-3.5.1.tar.gz protobuf-csharp-3.5.1.tar.gz protobuf-java-3.5.1.tar.gz protobuf-js-3.5.1.tar.gz protobuf-objectivec-3.5.1.tar.gz protobuf-php-3.5.1.tar.gz protobuf...
  • google protobuf

    2018-05-14 15:18:09
    google protobuf库文件,编译方法,及使用 google protobuf学习笔记一:windows下环境配置
  • Protocol Buffers (a.k.a., protobuf) are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data. You can find protobuf's documentation on the Google ...
  • protobuf 3.5.0

    2017-12-10 00:03:43
    protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。...由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用...Source code (protobuf-3.5.0.tar.gz)
  • Protobuf 详解

    万次阅读 2019-04-28 11:03:29
    Protobuf全称是Google Protocol Buffer,是一种高效轻便的结构化数据存储方式,可用于(数据)通信协议、数据存储等。 也可以理解为结构化数据的序列化方法,可简单类比为XML(这里主要是指在数据通信和数据存储这些...
  • linux protobuf

    2019-01-10 10:31:17
    linux 可下载的protobuf ,解压后直接可以用。
  • Protocol Buffers (a.k.a., protobuf) are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data. You can find protobuf's documentation on the Google ...
  • 获取源码: protobuf版本地址:...编译安装protobuf: ./autogen.sh ./configure make -j4 && make install 编译安装protobuf-c: export PKG_CONFIG_PATH=/usr/lo
  • protobuf详解一、什么是protobufprotobuf全称Google Protocol Buffers,是google开发的的一套用于数据存储,网络通信时用于协议编解码的工具库。protobuf是一种灵活高效的独立于语言平台的结构化数据表示方法。在...
  • protobufDemo.rar

    2020-09-25 10:39:44
    protobufDemo protobuf例程protobufDemo protobuf例程protobufDemo protobuf例程protobufDemo protobuf例程protobufDemo protobuf例程protobufDemo protobuf例程protobufDemo protobuf例程
  • protobuf - Installation

    2017-08-07 22:38:50
    protobuf
  • protobuf源码

    2018-07-30 16:12:11
    谷歌的通讯框架,类似于json和xml。把数据已某种形式保存起来.Protobuf相对与XML和Json的不同之处,它是一种二进制的数据格式,具有更高的传输,打包和解包效率。
  • protobuf2.6.1

    热门讨论 2014-11-27 23:55:48
    包含protobuf2.6.1编译好的lib和exe,把lib文件放到c:\windows即可。并带有protobuf的windows和linux的源码包。
  • protobuf 3.2.0

    2017-04-15 22:50:08
    Protocol Buffers (ProtocolBuffer/ protobuf )是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。现阶段支持C++、JAVA、Python等三种编程语言。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,840
精华内容 11,936
关键字:

protobuf