协议缓冲区 c# (protobuf-net) Message::ByteSize

Posted

技术标签:

【中文标题】协议缓冲区 c# (protobuf-net) Message::ByteSize【英文标题】:Protocol Buffers c# (protobuf-net) Message::ByteSize 【发布时间】:2010-02-22 19:57:59 【问题描述】:

我正在寻找与 C++ API Message::ByteSize 等效的 protobuf-net,以找出以字节为单位的序列化消息长度。

【问题讨论】:

【参考方案1】:

我没有使用过 C++ API,所以你必须给我更多的上下文/信息。这个方法有什么作用?也许是一个示例用法?

如果您正在使用流中的数据,则有“WithLengthPrefix”版本可以自动限制谨慎的消息,或者我相信只读取下一个长度的方法来自流的内容位于公共 API 上。

如果您想获得序列化的长度到位,那么目前我怀疑最简单的选择可能是序列化为虚拟流并跟踪长度。奇怪的是,protobuf-net 的早期版本确实有“不做工作就得到长度”的方法,但在对 protobuf-net 进行讨论后,我删除了这些。显然,序列化的数据仍然被跟踪。但是,由于 API 不同于对象的二进制数据长度,因此不能“免费”获得。

如果您澄清了用例是什么,我相信我们可以轻松使用它(如果还没有的话)。


重新评论;这就是我的怀疑。因为 protobuf-net 将二进制转换推迟到最后一刻(因为它处理的是常规的 .NET 类型,而不是一些自生成的代码),所以没有不做这项工作的自动获取这个值的方法。我可以添加一种机制,让您通过写信给Stream.Null 来获得这个值?但是如果您需要数据无论如何,您可能会受益于在复制数据之前写入MemoryStream 并检查.Length

【讨论】:

Message::ByteSize() 方法返回消息的序列化大小及其所有数据,包括子消息。我正在寻找一个类似的功能来在 SerializeWithLengthPrefix() 调用之前分配缓冲区,但作为替代方案,可以让 MemoryStream 处理扩展缓冲区并使用 ToArray() 调用来获取网络代码的缓冲区。

以上是关于协议缓冲区 c# (protobuf-net) Message::ByteSize的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 TCP 和 protobuf-net 接收包

使用协议缓冲区模拟泛型

针对 iOS 的 Unity3D 中的协议缓冲区

protobuf-net 中的人类可读表示

Protobuf-net 中的继承:ProtoInclude 和兼容性

protobuf-net 端口到 .net core 2.0 [关闭]