2010-02-22 138 views

回答

1

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

如果你是消费从数据流中,有“WithLengthPrefix”版本自动限制慎重的消息,或者我相信刚刚从流中读取下一个长度的方法是对公共API。

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

如果您澄清用例是什么,我相信我们可以轻松地提供它(如果它尚未)。


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

+0

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

+0

@SébastienTaylor - 我会更新... – 2010-02-23 05:11:24