Rust 中使用protouf序列化、反序列化

2022-06-12 22:25:05 浏览数 (3)

目的

在Rust中读取其他系统(C )生产的Protouf格式的数据文件。

  1. rust 1.58
  2. tonic
  3. prost

Cargo.toml

代码语言:txt复制
[dependencies]
tonic = "0.7.2"
prost = "0.10"
[build-dependencies]
tonic-build = {version="0.7.2", features=["prost", "compression"]}

project tree

代码语言:txt复制
├── Cargo.lock
├── Cargo.toml
├── build.rs
├── proto
│   ├── dsystemtopo.proto
│   └── test.proto
├── src
│   └── main.rs
├── system.bin
└── target
    ├── CACHEDIR.TAG
    └── debug

build.rs 用于编译Protobuf文件

代码语言:txt复制
extern crate tonic_build;

fn main() {
    tonic_build::configure()
        .compile(
            &["/root/test-tonic/proto/test.proto"],
            &["/root/test-tonic/proto"],
        )
        .unwrap();
    tonic_build::configure()
        .compile(
            &["/root/test-tonic/proto/dsystemtopo.proto"],
            &["/root/test-tonic/proto"],
        )
        .unwrap();
}

main.rs 测试

代码语言:txt复制
  extern crate prost;
  use std::io::Read;

  pub mod test {
      tonic::include_proto!("test2");
  }

  pub mod model {
      tonic::include_proto!("zdpower");
  }

  use prost::Message;

use model::PCalcSystem;
use model::*;

  fn main() {

      // 读取C   Protobuf格式二进制数据
      let mut stream = std::fs::OpenOptions::new()
          .read(true)
        .open("system.bin")
          .expect("read fail.");
      let mut data: Vec<u8> = Vec::new();
      stream.read_to_end(&mut data);

      // 解码
      let psystem: PCalcSystem = Message::decode(&*data).expect("decode fail!");
      println!("nodes:{}", psystem.system_nodes.len());
      // 编码
      let mut encode_data: Vec<u8> = Vec::new();
      psystem.encode(&mut encode_data);
      println!("encode_size:{}", encode_data.len());
  }

1 人点赞