Rust protobuf系列化都搞砸了

Rust protobuf系列化都搞砸了,rust,protocol-buffers,grpc,Rust,Protocol Buffers,Grpc,我正在使用rust protobufversion2.4 我有以下代码 let mut msg = vec![]; let mut str = protobuf::CodedOutputStream::vec(&mut msg); let mut rmsg = user_manager::user::user_data::new(); rmsg.set_id("1234".into()); rmsg.set_nick("test".into()); str.write_message(1

我正在使用
rust protobuf
version
2.4
我有以下代码

let mut msg = vec![];
let mut str = protobuf::CodedOutputStream::vec(&mut msg);
let mut rmsg = user_manager::user::user_data::new();
rmsg.set_id("1234".into());
rmsg.set_nick("test".into());
str.write_message(1, &rmsg).unwrap();
str.flush().unwrap();
println!("{:?}", msg);
let test: register_msg = protobuf::parse_from_bytes(&msg[..]).unwrap();
println!("serialized: {:?}\noriginal: {:?}", test, rmsg);
相关的原型描述如下

message user_data{
    string id           = 1; //required
    string nick         = 2;
    string theme        = 3;
    string admin_id     = 4;
    string lang         = 5;
    double credit       = 6; //required
    double bonus_credit = 7; //required
};
我得到的结果都是一团糟

首先,如果我序列化整个消息,为什么我需要输入一个数字?那真是个奇怪的设计

其次,您可能在proto文件中看到的第一个字段是id,但是序列化的输出显示protobuf包将所有内容序列化到nick字段中,nick字段是第二个字段

我是做错了什么,还是这可能是图书馆里的一个错误

更新1:

我已将
写入消息
更改为
写入字节
这就是我的代码现在的样子

let mut rmsg = user_manager::user::user_data::new();
rmsg.set_id("1234".into());
rmsg.set_nick("test".into());
let msg = rmsg.write_to_bytes().unwrap();
println!("{:?}", msg);
println!("{:?}", &msg[..]);
let test: register_msg = protobuf::parse_from_bytes(&msg).unwrap();
println!("serialized: {:?}\noriginal: {:?}", test, rmsg);
然而,输出结果还是一团糟。 这一行:

str.write_message(1, &rmsg).unwrap();
将消息
rmsg
作为字段id为
1
的子消息写入。因此,字段的嵌套级别更深,就好像您的
.proto
是:

message wrappermsg {
    user_data msg = 1;
}
正确的方法是:

rmsg.write_to(&mut str);

您可以使用
Message::write_to_bytes
序列化可以使用
parse_from_bytes
解析的消息

另外,请确保反序列化的类型与序列化的类型相同

下面是一个正常工作的示例程序:

modprotos;
使用protobuf::Message;
使用protos::user\u data::user\u data;
fn main(){
让mut rmsg=user_data::new();
rmsg.set_id(“1234.into());
rmsg.set_nick(“test.into());
让msg=rmsg.write_to_bytes().unwrap();
println!(“{:?}”,msg);
let test:user_data=protobuf::parse_from_bytes(&msg).unwrap();
println!(“序列化:{:?}\n原始:{:?}”,测试,rmsg);
}

查看
写入消息的描述,它只写入一个字段。尝试
rmsg.write_to(&mut str)
,我只是猜测根据文档可能会起作用。为什么您认为索引字段仍然是一个谜:Nick字段而不是Id:)@JayDepp btw write_to不存在范围内是否有消息特征?我现在包括了这一点,但输出仍然是相同的write_to和write_message都表现不正确,它不会改变任何东西结果仍然错误@jpaI仍然获得与nick使用的结果id完全相同,反序列化结构中不存在id。您的代码仍然使用
user\u data
作为序列化值,使用
register\u msg
作为反序列化值。像这样使用两种不同的类型是行不通的。对两个值使用相同的类型。哦,这是一个愚蠢的错误。我怎么没看到呢。谢谢你的帮助