交错 protobuf-net 和文件

Posted

技术标签:

【中文标题】交错 protobuf-net 和文件【英文标题】:interleave protobuf-net and file 【发布时间】:2012-05-20 11:09:10 【问题描述】:

我需要在计算机之间交换 protobuf-net 对象和文件,并试图找出最好的方法。 A 有没有办法通知 B 后面的对象是 protobuf 或文件?或者,当传输文件时,有没有办法知道文件已经结束并且后面的 Byte[] 是一个 protobuf?

使用 C# 4.0,Visual Studio 2010

谢谢,马尼什

【问题讨论】:

【参考方案1】:

这与 protobuf 或文件无关,与您的通信协议有关,特别是“框架”。这意味着简单:您如何在单个流中划分子消息。例如,如果这是一个原始套接字,您可能会选择发送(全部)

简短的消息类型,可能是一个字节:01 表示文件,02 表示特定文件的 protobuf 消息 一个长度前缀(通常是 4 个字节的网络字节顺序) 有效载荷,由之前的字节数组成

然后冲洗并为每条消息重复。

你没有说明你在问什么通讯,所以我可以更具体。

顺便说一句,另一种方法是将文件视为带有 byte[] 成员的 protobuf 消息 - 但主要适用于小文件

【讨论】:

非常感谢。将文件放入 protobuf 会很棒。根据您的经验,protobuf 可以正常工作的最大文件大小是多少? “你在问什么通讯” - 抱歉不明白这是什么意思。另外,什么是冲洗和重复的安全方法? @Manish 在内部存储它会想要使用一个 byte[] - 所以返回的问题是:你乐于使用的最大 byte[] 是什么?如果你在 protobuf-net 之外运行它,你当然可以只使用流式传输——对于大文件来说要好得多。重新“通信” - 我们在这里谈论的源/目的地是什么?这是一个平面二进制文件吗?一个插座? WCF 里面的东西? MSMQ 之类的中间件?需要了解更多背景信息才能提供全面建议。 谢谢马克。哦,我明白了。如果我们将文件放在 protobuf 中,如果我们想处理 1MB 的文件,就必须为所有 protobuf 声明 Byte[1000000]。如果文件大小不同,效率会非常低。知道了。我们只是使用套接字,希望避免使用 WCF 等框架以避免臃肿。文件是普通的 Word/ Pdf/ Excel 文件。推荐的流式传输的良好参考会很棒。大量 MSDN 代码示例混淆了首选方法的选择。 @Manish 不,不正确。 protobuf 中没有固定的大小。问题很简单:大数组很痛苦。当您有一个巨大的文件时,这可能是一个问题。 谢谢。在原始回复中,您提到“冲洗并重复”。冲洗,你的意思是stream.flush()吗?或者有没有更好的冲洗程序。

以上是关于交错 protobuf-net 和文件的主要内容,如果未能解决你的问题,请参考以下文章

protobuf-net - 反引号、字典和 .proto 文件

protobuf-net 生成的 .proto 文件中的字段命名约定不正确?

用于继承的 Protobuf-net .proto 文件生成

如何使用 protobuf-net 处理 .proto 文件

使用 Protobuf-net 将大数据文件流式传输为 IEnumerable

protobuf-net 和重复字段