在C++里面, 我们可以根据一个消息的名称, 动态的创建一个实例

google::protobuf::Descriptor* desc =
google::protobuf::DescriptorPool::generated_pool()
->FindMessageTypeByName("mypkg.MyType");
google::protobuf::Message* message =
google::protobuf::MessageFactory::generated_factory()
->GetPrototype(desc)->New();

这个在protobuf里面是集成进去了, 在其他语言也有类似的东西.

通过这个, 我们就让轻松实现编解码库, 而不需去构造一个映射表.

但是, 但是在rust里面, 是没有这种东西的. 比较难的地方是rust全局变量必须要实现Send trait, 否则是不能被共享的, 这样做确实安全, 但是对于我们实现MessageFactory就变得困难.

好在rust有thread_local和build.rs, 我们可以通过build.rs在编译proto文件的时候去遍历, 把每个消息添加到一个thread_local的hash map里面去, 从而曲线救国.

不说实现细节, 可以自己去看源码, 这边说如何使用和集成.

1. 创建一个子工程, 名字叫proto

然后将依赖添加进去:

[dependencies]
protobuf = "2.8.0" [build-dependencies]
protoc-rust = "2.8.0"
protobuf_message_factory = "0.1.2"

2. 把所有的.proto文件都添加到src目录下面去

3. 添加一个build.rs文件

extern crate protobuf_message_factory;

use protobuf_message_factory::*;

...

fn main() {

    let proto_path = "src/";

    let proto_files = get_protos_info(proto_path);
let proto_messages = get_proto_list(&proto_files); //!!! this is importent. !!!
protoc_rust::run(protoc_rust::Args {
out_dir: proto_path,
input: &protos,
includes: &[proto_path],
customize: Customize {
..Default::default()
},
}).expect("protoc"); //now generate factory codes
generate_factory_file(proto_path, &proto_files);
}

  然后把build.rs添加到toml里面去

4. 到主工程里面去, 添加对proto工程的依赖

[dependencies]
proto = {version="^0", path="proto"}

 

这时候, 就可以在主工程里面使用proto了

extern crate proto;

use proto::factory::*;
use proto::rpc::*;
use local_ipaddress; fn main() {
let desc = get_descriptor("mypkg.MyType".to_string()).unwrap();
println!("{}", desc.full_name());
let msg = desc.new_instance();
println!("msg: {:?}", msg);
}

  

cargo run:

就可以看到

mypkg.MyType

msg:

这时候就可以拿到MessageDesriptor, 通过这个对象可以new一个instance

仓库在这里https://crates.io/crates/protobuf_message_factory

关键字: MessageFactory, Protobuf, Rust

最新文章

  1. 【转载】用Ionic开发hybrid APP
  2. 30分钟学会如何使用Shiro
  3. 自动生成Model层中对应表的各个字段
  4. WPF框架MVVM简单例子
  5. NSURLConnection同步与异步请求 问题
  6. OpenStack 计算节点删除
  7. 重新开始学习javase_集合_Set
  8. oracle rac常用的命令
  9. Java编程中时区和时间相关的问题
  10. Windows内存管理简介:
  11. 动力IT教育背后的“神秘力量”
  12. flex布局下,css设置文本不换行时,省略号不显示的解决办法
  13. Java设计模式(四)——再谈观察者模式
  14. java导入excel时处理日期格式(已验证ok)
  15. iTOP-6818开发板支持AXP228电源管理[官方推荐最佳匹配]_支持动态调频
  16. 第一个博客——python通过值传递函数参数
  17. Web(二)
  18. Linux系统教程:设置GRUB菜单密码
  19. Strsafe.h:更安全的C语言字符串处理函数
  20. 重建二叉树(C++和Python实现)

热门文章

  1. ASP.NET Core快速入门(第2章:配置管理)--学习笔记
  2. win10 net framework 3.5提示错误代码0x800f081f
  3. Linux用户和权限——管理文件权限的命令
  4. vue笔记(一)
  5. maven 学习---将项目安装到Maven本地资源库
  6. long类型在内存中占8个字节,float类型在内存中占4个字节,为什么long还要比float小呢?
  7. osi七层简介(通俗易懂)
  8. 解决Vue调用springboot接口403跨域问题
  9. Shel脚本-初步入门之《04》
  10. python 正则表达式提取返回内容