【发布时间】:2019-05-14 15:00:25
【问题描述】:
如果不使用从它编译的 .proto/a 类,序列化的协议缓冲区是否难以解析?
显然,使用 .proto 更容易。我想知道使用协议缓冲区序列化的数据结构是否可以在没有它们的情况下轻松解析,给定数据的其他一些描述符。即,如果解析我的数据(使用协议缓冲区序列化)的代码知道它需要两个整数和一个布尔值,那么解析这些值是否容易?还是协议缓冲区添加了额外的填充/绒毛?
【问题讨论】:
标签: protocol-buffers
如果不使用从它编译的 .proto/a 类,序列化的协议缓冲区是否难以解析?
显然,使用 .proto 更容易。我想知道使用协议缓冲区序列化的数据结构是否可以在没有它们的情况下轻松解析,给定数据的其他一些描述符。即,如果解析我的数据(使用协议缓冲区序列化)的代码知道它需要两个整数和一个布尔值,那么解析这些值是否容易?还是协议缓冲区添加了额外的填充/绒毛?
【问题讨论】:
标签: protocol-buffers
如果解析我的数据(使用协议缓冲区序列化)的代码知道它需要两个整数和一个布尔值,那么解析这些值是否容易?
当然;您甚至不需要知道 - here's a tool 将尝试在没有任何架构数据的情况下解码未知的 protobuf,但有一些警告,有些数据可能不明确。 protoc 内置了一个类似的工具。
至于如何从您自己的代码中访问它:这完全取决于您使用的库。如果您使用的库有一个原始阅读器/解析器 API(而不仅仅是一个完整的反序列化器),那么您可以使用它。您还可以定义一个 proto2 原型类型,将所有内容都作为扩展字段,并使用扩展 API。或者,如果您知道特定对象的预期布局,则可以在 .proto 中声明自己的类型,或者甚至不声明。名称不需要匹配,只需匹配字段编号和类型。例如,使用 protobuf-net (.NET) 以下内容适用于您的场景:
class SomeType {
[ProtoMember(1)] public int A {get;set;}
[ProtoMember(2)] public int A {get;set;}
[ProtoMember(3)] public bool A {get;set;}
}
...
var obj = Serializer.Deserialize<SomeType>(source);
Console.WriteLine(obj.A); // int
Console.WriteLine(obj.B); // int
Console.WriteLine(obj.C); // bool
有额外的“填充/绒毛”,这就是为什么我推荐阅读器/解析器库的原因,但是......它并不那么困难。
【讨论】: