protobuf:连续序列化和反序列化到/从套接字

2024-01-08

在消息序列化到套接字 (SerializeToFileDescriptor) 后,C++ 客户端和 C# 服务器之间的简单通信陷入困境。

C++ 客户端:

  Person person;
  person.set_id(54321);
  person.set_name("bla");
  person.mutable_address()->set_line1("sdfa");
  person.mutable_address()->set_line2("asdfsdfa");

  cout << person.id() << endl << person.name() << endl;
  cout << person.address().line2() << endl;

  person.SerializeToFileDescriptor(s);

  ZeroCopyInputStream* raw_input = new FileInputStream(s);
  CodedInputStream* coded_input = new CodedInputStream(raw_input);

  Person person2;

  person2.ParseFromFileDescriptor(s);

  cout << person2.id() << endl << person2.name() << endl;
  cout << person2.address().line2() << endl;

C# 服务器

var sockServer = new TcpListener(2048);
sockServer.Start();

var person = new Person { Id = 123456, Name = "Fred", Address = new Address { Line1 = "Flat 1", Line2 = "The Meadows ar garą " } };

var socket = sockServer.AcceptSocket();
Stream str = new NetworkStream(socket);

var response = Serializer.Deserialize<Person>(str);
Console.WriteLine(response.Id);

Serializer.Serialize(str, person);

在我看来,这似乎是愚蠢可笑的,它不起作用。

如果我删除其中任何一个: person.SerializeToFileDescriptor(s) 或 person2.ParseFromFileDescriptor(s),另一个将起作用。

我应该怎么做才能让它们同时工作?


默认行为对于根对象就是消耗所有数据到流的末尾。由于您不关闭流,因此结束永远不会到来。

如果您的意图是在同一个套接字上发送多个对象(这很正常),那么您需要给它一个线索。最常见的方法是在每条消息前加上要发送的数据的长度前缀。这可以是固定的 32 int,或者如果方便的话可以是 varint。然后您可以在消费者处阅读该内容。

然后你如何处理取决于调用者; protobuf-net 有一个DeserializeWithLengthPrefix它将处理各种形式的编码,有或没有附加字段标记(在 varint 的情况下,使其成为有效的 protobuf 流)。例如:

Person person = Serializer.DeserializeWithLengthPrefix<Person>(str,
        PrefixStyle.Fixed32, 0);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

protobuf:连续序列化和反序列化到/从套接字 的相关文章

  • 插入多重集中:在该值第一次出现之前而不是最后一次出现之后

    正如标题所示 multiset 在所有相同值的范围末尾插入一个值 例如 在多重集中插入 21 2 2 3做到了1 2 2 new 2 3 如何在所有相同值的范围开头插入新值 例如 在多重集中插入 21 2 2 3应该使1 new 2 2 2
  • OpenSSL:RSA 加密/解密、密钥生成和密钥持久性

    我正在尝试构建一个需要以下内容的 p2p 应用程序 在 OpenSSL 中使用 RSA Encryption Decryption Generating Keys done Saving and loading keys done Savi
  • 寻求有关 cs50“现金”问题集的 C 贪婪算法的帮助[已关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 目标是创建一种算法 该算法接受输入并给出从输入中减去值 25 10 5 1 的次数的输出 代码需要以尽可能贪婪的方式执行此操作 尽可能获取最
  • 在 C# 中格式化 Resharper 属性的支持字段

    有没有办法控制 Resharper 放置其支持字段的位置 目前 它试图让他们在班级中名列前茅 我希望他们能去到酒店的正上方 还没有
  • 是否有任何替代方法来实现 WebRTC SFU,只有 1 个上传流?

    我有一个服务器 能够将 WebRTC 媒体数据从 A 中继到 B 对于视频会议 如果我们采用 P2P 方法 则会创建一个网状网络 当P2P不起作用的时候 我们就可以拥有这个中继服务器 主要问题是在网状网络中 对于N个参与者来说 上传链路的数
  • asm、asm 易失性内存和破坏性内存之间的区别

    在实现无锁数据结构和定时代码时 通常需要抑制编译器的优化 通常人们使用asm volatile with memory在 clobber 列表中 但有时你会看到asm volatile或者只是一个简单的asm破坏记忆 这些不同的语句对代码生
  • 嵌套绑定表达式

    这是一个后续问题我之前的问题 https stackoverflow com questions 2735294 templates function pointers and c0x include
  • 委托 System.Action 不接受 1 个参数

    那个行动 readonly Action execute public RelayCommand Action execute this execute null public RelayCommand Action execute Fun
  • 安装/编译 pylzma(lzma python 绑定)

    我已经向作者提出了这个问题website http www joachim bauch de projects pylzma comment page 1 comment 5211 但我想我也可以在这里问 我一直在尝试使用以下设置安装 py
  • 具有 Nhibernate 设计问题的领域模型

    我正在尝试进入 DDD with C 世界 我使用NHibernate作为我的ORM工具 因此尝试开发一个PI Persistence Ignorance 模型 但是 在我的一些实体 表示为 POCOS 中 我的属性设置器中有业务规则 例如
  • C#:如何计算纵横比

    我对编程比较陌生 我需要根据给定尺寸 例如 axb 计算纵横比 16 9 或 4 3 我如何使用 C 来实现这一点 任何帮助将不胜感激 public string AspectRatio int x int y code am lookin
  • 如何在运行时统一捕捉两个对象?

    这是 3D 模型 我想将另一个像这样的模型连接到顶部的银色连接器 并将另一个模型连接到右侧 所以请帮助我捕捉它 https i stack imgur com qoWwl png我想知道如何在运行时将两个 3D 对象对齐在一起 即 在 玩
  • 使用 C# 在 XML 文档中查找特定值的好方法是什么?

    我正在调用 Oracle 公开的 WebService 它接受 ItemID 的输入并向我返回相应的 Item Number 我想获取从响应中包含的 XML 返回的项目编号 XML 看起来像这样
  • WiX 安装程序在 vs 2012 上不起作用

    我想为我的应用程序创建一个安装程序 我已经下载了 WiX 3 6 并将其安装在 vs 2012 上 创建简单的winform应用程序 将 WiX 安装项目添加到我的解决方案中 右键单击参考并将我的 winform 应用程序添加到安装程序的参
  • 访问控制器类中的 appsettings.json 值

    无法弄清楚如何读取startup cs之外的appsettings json值 例如 我想做的是在 Layout cshtml 中 从配置中添加站点名称 例如 ViewData SiteName Configuration GetValue
  • 获取上下文菜单的控制

    我有一个如下所示的上下文菜单 A 1 2 3 选择 1 2 或 3 后 我需要访问调用上下文菜单的对象 意思是如果这是 textbox1 的上下文菜单 那么我需要访问该对象 我该怎么做 忘了说了 这是一个WPF应用程序 所以我使用 Syst
  • 是否可以使用 struct stat 描述符获取和设置文件名?

    是否可以在获取或设置 重命名 文件名时给出文件的绝对路径 并将 struct stat 实例作为 lstat 函数的参数 正如我在文档结构中发现的那样 struct stat dev t st dev ID of device contai
  • Cmake:在自定义目录中查找 protobuf 包

    我有 cmake 3 10 x 并下载了当前的 protobuf 源 3 6 1 使用 cmake 我创建了 bin 目录 PROTOBUF SOURCE DIR bin 在其中成功构建了该库 下一步我想在我的基于 cmake 的项目中使用
  • 类型与创建 CLR 存储过程不匹配

    我在程序集中有一个如下所示的方法 namespace MyNameSpace public class MyClass Microsoft SqlServer Server SqlProcedure public static void M
  • Windows 安装程序 (C#) 错误代码 2869

    我在 VS 2005 中有一个项目 其中有一个控制台应用程序和一个与安装该应用程序关联的安装项目 我在控制台应用程序中还有一个安装程序类 安装项目将使用它在安装前进行一些验证 这些任务正在检查数据库连接字符串并检查某些目录位置以确保它们在安

随机推荐

  • 如何使用MVVM自动隐藏WPF中的DataGrid列? [复制]

    这个问题在这里已经有答案了 使用 MVVM 无代码隐藏 我想在选择时隐藏我的 DataGrid 列 我有以下代码
  • 如何在 Xcode IDE 中启用垂直分割视图?

    我正在深入研究 iOS 开发 并且在多显示器设置上使用 Xcode 显然 我想利用多个监视器来查看和编辑源代码的多个窗格 但我很难弄清楚如何启用垂直拆分视图 在其他 IDE 中 这只是您在 窗口 菜单中单击的一个选项 如何在 Xcode 中
  • 在用 QtSpim 编译的 MIPS 中生成随机整数

    所以我看到了很多关于使用 MARS 在 MIPS 程序中生成随机整数的问题 系统调用 42没关系 问题是我需要为编译的程序生成一个随机整数QtSpim 它没有 42 或大于 17 的系统调用 我无法弄清楚从系统中获取类似随机值的东西 例如
  • 将值替换为该列的平均值 - 许多列

    我有一个包含超过 1000 列和 11000 行的 Excel 工作表 全部包含数字数据 数据中存在用 表示的缺失值 我想用它所在列的平均值替换所有 值 手动执行此操作需要很长时间 那么是否有一个公式可以实现此目的 非常感谢您的帮助 我可以
  • Apache Spark,向现有 DataFrame 添加“CASE WHEN ... ELSE ...”计算列

    我正在尝试使用 Scala API 将 CASE WHEN ELSE 计算列添加到现有的 DataFrame 中 起始数据框 color Red Green Blue 所需的数据帧 SQL 语法 CASE WHEN color Green
  • 在 flutter 中从父颜色生成自定义色调

    我需要找到一种更好的方法来从给定的自定义颜色生成阴影颜色以用于主题目的 到目前为止 我找到了一种通过降低给定颜色的不透明度来实现此目的的方法 如下所示 所以我可以强调颜色颜色和给定颜色的褪色颜色到此功能 import package flu
  • 如何从主脚本将导入的模块块传输到表面上?

    在我的主文件中 我有一个名为win 我像这样导入一个模块from draw import def draw image x y win blit image x y 这是一个来自draw 它不起作用 因为win没有定义 如何定义它 将目标表
  • ES6导出默认函数

    我可以为每个文件导出多个函数吗 似乎当我这样做时 第二个函数会覆盖第一个函数 例子 在my index js file export default function aFnt console log function a export d
  • Angular 4 - router.url 单元测试

    如何在 Angular 4 单元测试中模拟 router url 我在组件的 ngOninit 中使用 router url 但在我的测试中 router url 的值为 在 Angular v9 中Router url是只读 getter
  • 未找到 Django URL 模式

    我按照教程允许用户注册帐户 但似乎找不到 url 路径 当我设置名称时 它允许我访问 127 0 0 1 8000 accounts signup 但不能访问 127 0 0 1 8000 signup 我尝试将 urlpatterns 从
  • j_spring_security_check HTTP 状态 404(自定义登录)

    我正在使用 Spring 4 Hibernate 4 我检查了每一篇文章 但我无法找出问题所在 Web xml
  • iOS 上有什么好的自定义键盘实现教程吗?

    我需要为区域语言 泰米尔语 制作一个自定义键盘 如果用户按下自定义键盘键 我必须引入泰米尔字体 那可能吗 如果是的话 有可用的教程或资源吗 提前致谢 http cocoacontrols com platforms ios controls
  • R dplyr。过滤包含一列数值向量的数据框

    我有一个数据框 其中一列包含数字向量 我想根据涉及该列的条件过滤行 这是一个简化的示例 df lt data frame id LETTERS 1 3 name c Alice Bob Carol mylist list c 1 2 3 c
  • 使用猫头鹰轮播在触摸设备上滑动时禁用垂直滚动

    我想在移动设备上水平滑动轮播时禁用网页上的垂直滚动 我正在使用猫头鹰旋转木马 我尝试使用 css Overflow hidden 到 html body 但不起作用 尝试了其他解决方案 但它们不起作用 我尝试过的代码在下面 Tried th
  • 日期时间之间的差异

    我这里有一些代码可以计算两个日期时间之间的小时差 这里有点不知所措 代码时好时坏 我不知道为什么 var date tr find td eq 10 input val var time tr find td eq 10 option se
  • 从 doc 和 docx 中提取文本

    我想知道如何阅读 doc 或 docx 的内容 我使用的是 Linux VPS 和 PHP 但如果有使用其他语言的更简单的解决方案 请告诉我 只要它在 Linux 网络服务器下工作即可 在这里我添加了从中获取文本的解决方案 doc docx
  • 包含 13 位数字的字段的正则表达式?

    我需要一个正则表达式来检查字段是否为空或者是否正好是 13 位数字 问候 弗朗西斯 P 尝试这个 另请参阅 rubular com http www rubular com r SYIlg16mHn d 13 解释 是字符串锚点的开头和结尾
  • 在代码中创建 RowDefinitions 和 ColumnDefinitions

    我为Windows Phone开发应用程序 我想创建 2 行 2 列的表 我为此表创建 xaml 代码
  • 使用无障碍 JQuery 在部分视图中显示错误消息时遇到问题

    以下是我在 MVC3 中的区域 Model public class AdminModule Display Name My Name Required public String MyName get set 局部视图 model 1 A
  • protobuf:连续序列化和反序列化到/从套接字

    在消息序列化到套接字 SerializeToFileDescriptor 后 C 客户端和 C 服务器之间的简单通信陷入困境 C 客户端 Person person person set id 54321 person set name b