[英]Google ProtoBuf serialization / deserialization
我正在阅读Google Protocol Buffers
。 我想知道我可以Serialize C++ object
并将其在线发送到Java服务器并在java
Deserialize
那里的字段。
而是我想将对象从任何语言发送到Java Server。 并在那里反序列化。
假设以下是我的.proto
文件
message Person {
required int32 id = 1;
required string name = 2;
optional string email = 3;
}
我对此进行了protoc
,并创建了一个C++
对象。 基本上现在我想将序列化的流发送到java
服务器。
在Java方面,我可以在此deserialized
化流,以便可以发现流中有3
字段及其各自的name, type, and value
在Java方面,我可以在此反序列化流,以便可以发现流中有3个字段及其各自的
name
,type
和value
您将需要事先了解架构。 首先,protobuf 不传输名称 ; 所有它使用作为标识符是数字键( 1
, 2
和3
的每个字段的在你的例子)。 其次,它没有明确指定类型。 protobuf中只有很少的线型(varint,32位,64位,长度前缀,组); 实际的数据类型已映射到这些数据类型,但是如果没有模式,您将不能明确地解码数据
repeated
值集,也可以是结构化子-protobuf格式的消息 所以从根本上说:您需要架构。 编码的数据不包括您想要的。 这样做是为了避免不必要的空间-如果协议假设编码器和解码器都知道消息的含义,则需要发送的信息要少得多。
但是请注意,该所包含的信息是足够安全地往返,即使有未预期的字段的消息; 如果您只需要重新编码以沿/返回传递,则无需知道名称或类型。
您可以做的是使用解析器API扫描数据以显示存在三个字段,字段1为varint,字段2为长度前缀,字段3为长度前缀。 您可以对超出此范围的数据进行有根据的猜测 (例如,您可以查看UTF-8解码是否产生了看起来像文本的东西,并验证UTF-8编码是否可以返回原始字节;如果可以) , 可能是字符串)
我可以序列化C ++对象并将其在线发送到Java服务器,然后在Java中反序列化到Java服务器并进行内部检查。
是的,这是protobuf的真正目标。
在以任何受支持的语言开发的应用程序中序列化数据,并在以任何受支持的语言开发的应用程序中反序列化数据。 序列化和反序列化语言可以相同或不同。
请记住,协议缓冲区不是自描述的,因此应用程序的两面都需要具有从.proto
文件生成的序列化器/反序列化器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.