Protobuf安装和Scala使用

工作需要 Protobuf 进行序列化传输,这里记录一下。

Protobuf 是google开发的一种用于高效存储和读取结构化数据的工具。类似于Json,xml等用来重复的记录结构化的数据,Protobuf 序列化和反序列化的性能非常高,而且压缩比Json等高很多。

功能主要是使用 Protobuf 生成一个.proto 文件,再编译成相应语言代码,调用即可。

Centos7.3,Scala + Java 环境。这里简单用Scala实现以下,事实上Scala 有 ScalaPB,是 Protocol buffer 的编译器插件,可以为 Protobuf 自动生成Scala case类、解析器和序列化。

 

安装

最近版本3.9.2  下载源码 Source code

查看删除旧版本位置

 查看版本

cd /usr/local/protobuf-3.9.2/bin
./protoc --version

 删除

whereis protoc

# 如果存在删除即可
rm /usr/local/bin/protoc

安装依赖库

# 用到的库
yum install -y unzip autoconf automake libtool make g++ gcc-c++ glibc-headers

 解压到当前目录

unzip protobuf-3.9.2.zip
tar -zxvf protobuf-3.9.2.tar.gz

编译

cd protobuf-3.9.2
./autogen.sh
./configure prefix=/usr/local/protobuf-3.9.2     # 可以不指定克隆路径 prefix=
make
make check
make install

 

使用

创建声明文件,如头条的dmp数据

vim toutiao_dmp.proto

package toutiao.dmp;
option java_outer_classname = "DmpDataProto";
message DmpData { //上传文件每行一个base64编码的字符串,每个字符串包含一个完整的DmpData消息二进制字节串
  repeated IdItem idList         = 1; // 每行数据包含的idList大小不能超过10000
}
message IdItem {
    optional uint32 timestamp  = 1;  //若不设置,默认以上传文件的创建时间为此条记录的创建时间
    required DataType dataType = 2;  //指定此id的类型,如IMEI、IDFA等
    required string id         = 3;  //根据dataType字段的类型,放置对应类型的id的字符串,需要小写
    repeated string tags       = 4;  //标识此id的业务标签字符串
    enum DataType {
        IMEI               = 0;
        IDFA               = 1;
        UID                = 2;
        MOBILE             = 3;
        IMEI_MD5           = 4;
        IDFA_MD5           = 5;
        MOBILE_HASH_SHA256 = 6;
    }
}

 

生成 java 文件

./protoc toutiao_dmp.proto --java_out=./

# 生成的文件位置, protobuf-3.9.2/toutiao/dmp/DmpDataProto.java

 

 测试

object MakeToutiaoDmp {
  def main(args: Array[String]): Unit = {
    genereate_valid_file()
  }

  def genereate_valid_file(): Unit = {
    // 使用builder构建一个对象
    val dmp_data = DmpData.newBuilder
    val id_item1 = dmp_data.addIdListBuilder()
      .setDataType(IdItem.DataType.IMEI)
      .setId("356145080566857")
      .addTags("信用卡")
      .addTags("理财")
      .setTimestamp(System.currentTimeMillis().toInt)

    val id_item2 = dmp_data.addIdListBuilder()
      .setDataType(IdItem.DataType.IDFA)
      .setId("1E2DFA89-496A-47FD-9941-DF1FC4E6484A")
      .addTags("黄金")
      .addTags("理财")

    // build() 结束builder,返回对象
    val binary_string = dmp_data.build().toByteArray
    val result_string = Base64.decodeBase64(binary_string)

    // 测试 1
    //    序列化
    //    val buff = id_item1.build().toByteArray
    //    val in = new ByteArrayInputStream(buff)
    //    反序列化
    //    val item = IdItem.parseFrom(in)
    //    println(item.getDataType, item.getId, item.getTagsList,item.getTimestamp)
    //    (IMEI,356145080566857,[信用卡, 理财],1886284553)

    // 测试 2 
    // 序列化
    val out = new ByteArrayOutputStream
    id_item2.build().writeTo(out)
    val buff = out.toByteArray
    // 反序列化
    val in = new ByteArrayInputStream(buff)
    val id_item3 = IdItem.parseFrom(in)
    println(id_item3.getDataType,id_item3.getId,id_item3.getTagsList)
    // (IDFA,1E2DFA89-496A-47FD-9941-DF1FC4E6484A,[黄金, 理财])

    // 输出到文件
    val output = new FileOutputStream("d:\\data\\target")
    output.write(result_string)
    output.write('\n')
    output.close()
  }
}

调用

  /**
    * 序列化
    */
  def validateAndGenerateFile(line: String): Array[Byte] = {
    val strings = line.split(",")
    val dmpDataBuilder = DmpData.newBuilder()
    dmpDataBuilder.addIdListBuilder()
      .setDataType(IdItem.DataType.valueOf(strings(0).toUpperCase))
      .setId(strings(1))
      .build()
    val byteArray = dmpDataBuilder.build().toByteArray
    Base64.encodeBase64(byteArray)
  }

 

Builder 和 Message

Protobuf 生成的java类中,包含两种内部类:Builder和Msg。区别:

Builder 用来构建类,提供类操作的API,set、get等方法

Msg 用来获取数据、序列化、反序列化,没有set方法

一般会先Builder构建Msg,再使用 Msg 序列化成字节流。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在CentOS上安装使用protobuf,可以按照以下步骤进行操作: 1. 首先,确保系统中已经安装了autoreconf工具。如果没有安装,可以使用以下命令安装: ``` sudo yum install autoconf automake libtool ``` 2. 接下来,使用wget命令下载protobuf安装包。例如,下载版本为3.21.9的protobuf安装包,可以使用以下命令: ``` wget https://github.com/protocolbuffers/protobuf/releases/download/v3.21.9/protobuf-cpp-3.21.9.tar.gz ``` 3. 解压下载的安装包,并进入解压后的目录: ``` tar -xvzf protobuf-cpp-3.21.9.tar.gz cd protobuf-3.21.9/ ``` 4. 运行autogen.sh脚本以生成配置文件: ``` ./autogen.sh ``` 5. 执行configure命令以配置protobuf安装路径: ``` ./configure ``` 6. 运行make命令进行编译: ``` make ``` 7. 使用sudo make install命令以管理员权限安装protobuf: ``` sudo make install ``` 8. 安装完成后,可以使用protoc --version命令来验证安装是否成功,并查看protobuf的版本号: ``` protoc --version ``` 以上是在旧版本的CentOS上安装protobuf的步骤。如果你使用的是新版本的CentOS,可以按照以下步骤进行操作: 1. 下载protobuf安装包并解压: ``` tar zvxf protobuf-all-3.6.1.tar.gz cd protobuf-3.6.1 ``` 2. 运行configure命令进行配置。你可以选择添加--prefix选项来指定安装路径: ``` ./configure --prefix=/usr/local/ ``` 3. 执行make命令进行编译。这个过程可能需要一些时间: ``` make ``` 4. 使用sudo make check命令运行测试: ``` sudo make check ``` 5. 最后,使用sudo make install命令以管理员权限安装protobuf: ``` sudo make install ``` 安装完成后,可以使用protoc --version命令来验证安装是否成功,并查看protobuf的版本号: ``` protoc --version ``` 通过按照以上步骤安装protobuf,你就可以在CentOS上成功安装使用它了。<span class="em">1</span><span class="em">2</span><span class="em">3</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

訾零

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值