Protocol buffers 从原始消息中检测类型

2024-01-12

是否可以检测原始协议缓冲区消息的类型(以字节[]为单位)

我遇到的情况是端点可以接收不同的消息,并且我需要能够在反序列化之前检测到类型。

我正在使用 protobuf-net


您无法单独检测类型,因为 protobuf 规范不会为此向流添加任何数据;但是,根据具体情况,有多种方法可以轻松实现这一点:

  • 联合类型(如乔恩提到的)涵盖了一系列场景
  • 继承(特定于 protobuf-net)可以是通用的 - 您可以拥有基本消息类型和任意数量的具体消息类型
  • 您可以使用前缀来指示传入类型

对于原始 TCP 流,最后一种方法实际上非常有价值;这是在电线上与联合类型相同,但实现不同;通过提前决定 1=Foo, 2=Bar 等(与联合类型方法完全相同),您可以使用SerializeWithLengthPrefix写入(指定 1/2/etc 作为字段号),以及非泛型TryDeserializeWithLengthPrefix要阅读(这位于 v1 API 中的 Serializer.NonGeneric 下,或位于 v2 API 中的 TypeModel 上),您可以提供一个类型映射,将数字解析回类型,从而反序列化正确的类型。并先解决“为什么这对 TCP 流有用?”的问题。 - 因为:在正在进行的 TCP 流中,您need使用WithLengthPrefix方法anyway,避免过度读取流;所以你不妨免费获得类型标识符!

summary:

  • union类型:易于实现;唯一的缺点是必须检查哪些属性不为空
  • 继承:易于实现;可以使用多态性或判别器来处理“现在做什么?”
  • 类型前缀:实现起来有点复杂,但具有更大的灵活性,并且 TCP 流的开销为零
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Protocol buffers 从原始消息中检测类型 的相关文章

  • 使用 strcpy 从整数生成指针,无需进行强制转换

    我不明白我做错了什么 我正在学习 C 很抱歉 如果这显然是错误的 但我正在尝试使用uthash http uthash sourceforge net 制作股票及其价格的哈希图 但是当我将股票添加到哈希映射时 我收到上述错误 我所做的就是从
  • 如何通过实体键添加/删除与实体框架的多对多关系?

    I tried using Entities e new Entities EntityKey key new EntityKey Entities Users UserId 20 User user new User EntityKey
  • 通过 TCP/.NET SSLStream 发送文件很慢/无法正常工作

    我正在编写一个与 SSL 配合使用的服务器 客户端应用程序 通过SSLStream 它必须做很多事情 不仅仅是文件接收 发送 目前 它的工作原理是 只有一个连接 我总是使用从客户端 服务器发送数据SSLStream WriteLine 并使
  • 为什么数组不可赋值? [复制]

    这个问题在这里已经有答案了 据我所知 C 标准禁止使用数组作为可修改的左值 即在赋值的左侧 int lhs 4 rhs 4 0 1 2 3 lhs rhs illegal 现在 我一直想知道为什么会这样 我可以看到上面的语句 以及写入数组的
  • 获取不带波形符的泛型类名称[重复]

    这个问题在这里已经有答案了 我正在尝试获取类型名称T使用这个 typeof T Name 班级名称是ConfigSettings 而不是返回ConfigSettings它正在返回ConfigSettings 1 有什么具体原因吗 我怎样才能
  • 如何修复 TcpClient Ip 标头错误校验和

    我正在使用 System Net Sockets TcpClient 类 但每当我通过网络发送自定义数据包时 我都会在wireshark捕获上看到错误的校验和 我该如何修复它 问题是您在网络接口上设置了校验和卸载 这会导致您的网卡计算校验和
  • 用于轻松动态反射的 C# 库

    是否有任何库 例如开源项目等 可以更轻松地使用复杂的反射 例如动态创建对象或类 检查实例等 Thanks 有一个LinFu http www codeproject com KB cs LinFuPart1 aspx可用的库除了反射之外还可
  • 如何使用 Linq to Sql 修剪值?

    在数据库中 我有一个名为 联系人 的表 名字和其他此类字符串字段设计为使用 Char 数据类型 不是我的数据库设计 我的对象 Contact 映射到属性中的字符串类型 如果我想做一个简单的测试 通过 id 检索 Contact 对象 我会这
  • 获取RFC返回的嵌套结构的值?

    我是 C 新手 我有 rfc 它以嵌套结构的形式从 SAP 系统返回数据 但是当我使用以下方式获取该数据时 IrfcTable table rfc getTable exporting parameter et customer 它仅返回第
  • OpenMP 和 C++:this 指针

    Is thisOpenMP 中始终共享指针 尽管编译器不会抱怨以下代码default none pragma omp parallel for default none shared n for SInt i 0 i lt n i f i
  • 如何在控制台程序中获取鼠标位置?

    如何在 Windows 控制台程序中用 C 获取鼠标单击位置 点击时返回鼠标位置的变量 我想用简单的文本命令绘制一个菜单 这样当有人点击时 游戏就会注册它并知道位置 我知道如何做我需要做的一切 除了单击时获取鼠标位置 您需要使用 Conso
  • AllowUserToAddRows 不适用于 DataGridView 上的 List<> 数据源

    我有一个DataGridView与DataSource set to List
  • 使用客户端 hello 消息进行 TLS 协议检测

    我需要检测网络流量中的 https 数据包 到目前为止 我将所有 443 标记为 https 但我不想再在这种情况下使用端口信息 检查客户端问候消息是否足够 Check 22 and version info 0300 0301 or 03
  • XSD、泛型和 C# 类的困境

    我有以下简单的 XSD 文件
  • 如何获取数字列的确切类型,包括。规模和精度?

    有没有办法知道列中列的确切类型DataTable 现在我正在这样做 DataTable st dataReader GetSchemaTable foreach DataColumn col in st Columns var type c
  • .NET 发布模式构建中是否提供堆栈跟踪信息?

    如果我选择发布模式来构建 dll 堆栈跟踪信息仍然可用吗 如果是的话 那么什么信息is发布模式下不可用 您始终拥有堆栈跟踪信息 这是与构建模式无关的运行时功能 但行号和源文件名通常在发布构建堆栈跟踪中不可用 您可以通过更改构建配置来创建完整
  • 有没有办法将复选框列表绑定到 asp.net mvc 中的模型

    我在这里寻找一种快速简便的方法来在模型中发生回发时绑定复选框列表项的列表 显然现在常见的做法似乎是这样的form GetValues checkboxList 0 Contains true 这看起来很痛苦而且不太安全 有没有一种方法可以绑
  • Eclipse CDT C/C++:包含另一个项目的头文件

    我在 Eclipse CDT 中有两个 C 项目main and shared In shared我有一个名为calc h 我想在中使用这个标头main 所以我做了以下事情 added include calc h到相关文件main In
  • C++11 中引入了哪些重大更改?

    我知道 C 11 中至少有一项更改会导致一些旧代码停止编译 引入explicit operator bool 在标准库中 替换旧实例operator void 诚然 这将破坏的代码可能是一开始就不应该有效的代码 但它仍然是一个破坏性的变化
  • 如何在 C# 中将 json 转换为平面结构

    我正在尝试用 C 编写函数 将 JSON 转换为键 值对 它应该支持数组 例如下面的 JSON title title value components component id id1 menu title menu title1 tit

随机推荐

  • jQuery Mobile:对所有页面使用相同的页眉页脚

    我正在尝试实现一些代码 这些代码将在我的所有网页上创建页眉和页脚 而不是对它们进行硬编码 我试过这个 我在我的 主页 中有这个 我只是将我想要的标题包装在 div 中 div div h1 Title h1 div div 然后在其他页面中
  • VS2012 如何关闭编辑器选项卡着色?

    我努力阅读 Visual Studio 2012 源代码编辑器中的选项卡 我什至不明白不同颜色代表什么意思 它们看起来完全是随机的 黑底棕色或黑底蓝 谁选呢 所以我想关闭选项卡的颜色并恢复为白底黑字或浅灰色 我看过 选项 gt gt 环境
  • 按使用 Rails 3 的儿童数量过滤

    我想使用 Rails 3 和单个查询来选择具有一个或多个评论的帖子 我正在尝试这样的事情 Post includes comments where count comments id gt 0 但是我收到这个错误 ActiveRecord
  • 您的规范源均不包含满足依赖项的规范:Firebase (~> 6.33.0)、Firebase (= 6.33.0、~> 6.33.0)

    我正在将一些 Firebase SDK 实现到我的 pod 中 但我在对它们进行版本控制时遇到问题 我想设置 Firebase 6 33 我确实检查了这个版本的 pod 规格并根据该规格更新了我的 pod pod Firebase gt 6
  • Web 配置错误:无法识别属性“xmlns:xdt”。请注意,属性名称区分大小写

    我正在尝试将应用程序部署到 AppHarbor 并按照他们有关如何修改我的 web config 的说明进行操作 因此它使用他们的 auf Sql 服务器实例 运行解决方案后 我收到主题中提到的错误 Unrecognized attribu
  • 接受表单元素作为方法参数?

    我正在编写一个方法 它将截取传递的表单元素的屏幕截图并将其打印出来 我面临一些挑战 我希望能够使这个方法足够通用 以接受几乎任何类型的表单元素 我将 元素 参数设置为 对象 类型 我想我还需要传递一个 类型 参数 或者有没有办法弄清楚对象传
  • telerik radGrid - 在排序/分页/过滤器上保留客户端状态

    即使在这个阿贾克斯例子 http demos telerik com aspnet ajax grid examples hierarchy nestedviewtemplate defaultcs aspx我真的很喜欢它的外观 当顶层网格
  • 如何通过 from_avro 标准函数使用 Confluence Schema Registry? [复制]

    这个问题在这里已经有答案了 My Kafka 和 Schema Registry 基于 Confluence Community Platform 5 2 2 My Spark 版本为 2 4 4 我使用以下命令启动 Spark REPL
  • 使用 getter/setter 与“告诉,不要问”?

    只讲原则 不问原则here http pragprog com articles tell dont ask当我使用 getter 或 setter 时 经常会粘贴到我身上 人们告诉我不要使用它们 该网站清楚地解释了我应该做什么和不应该做什
  • 如何通过深度链接传递数据?

    我的应用程序中有一个报价列表 每个列表项上都有一个共享按钮 当任何用户单击共享链接时 我正在使用深层链接打开我的应用程序的报价详细信息活动 我处于以下情况当有人点击链接时 我的详细信息页面活动就会被触发 但是我怎么知道 当有人点击共享深层链
  • C++ 检查大括号是否匹配

    我被要求作为一项额外的编程挑战 看看大括号是否在随机字符串或字符中匹配 如下所示 1 1 将返回 1 而 1 1 将返回 0 这是我到目前为止所拥有的 但它似乎没有做任何事情 任何帮助都会很棒吗 谢谢 bonus cpp include
  • Tkinter - 将文本插入画布窗口

    我有一个 Tkinter 画布 其中填充了文本和画布窗口或小部件 使用create text and create window方法 我放置在画布上的小部件是文本小部件 我想在创建和放置它们后将文本插入其中 我不知道如何做到这一点 如果可能
  • 如何对数据框中的列进行重新排序?

    如何更改此输入 顺序为 时间 输入 输出 文件 Time In Out Files 1 2 3 4 2 3 4 5 对于此输出 顺序为 时间 输出 输入 文件 Time Out In Files 1 3 2 4 2 4 3 5 这是虚拟 R
  • 使用 urllib 发出 post 请求

    我正在尝试向 API 提供商提出请求 curl https api infermedica com dev parse X POST H App Id 4c177c H App Key 6852599182ba85d70066986ca2b
  • 如何将第三方 javascript 库与 ionic4 和电容器一起使用?

    使用 Ionic 4 Angular 应用程序和 Capacitor 安装第三方 javascript 库的正确方法是什么 我尝试安装克鲁克图书馆 https github com jackedgson crunker如下 npm inst
  • Angular 2 中不同页面的多种布局

    我有一个登录页面 只有 2 个输入 无页眉 无页脚 无侧边栏 当用户登录时 他应该导航到带有页眉 页脚和右侧导航栏的页面 内页唯一改变的是右侧内容 import Component from angular core import View
  • Android Studio 中相对布局问题中按钮顶部的进度条

    好吧 这是一个奇怪的问题 我希望有人能向我解释一下 我有一个自定义按钮布局 它创建一个按钮 按钮中间有一个圆形进度条 我的 XML 代码如下 然而我无法解决的是ProgressBar似乎出现在按钮后面 如果我将按钮背景设置为透明以外的任何内
  • Spring Boot 组件扫描不起作用

    我创建了一个示例 Spring Boot 应用程序 当服务类全部位于一个包中时 该应用程序运行得非常好 但如果服务类引用不同包中的另一个服务类 那么我会收到 BeanCreationException 应用程序的代码如下 主程序 java
  • GLEW:Apple Mach-O 链接器 (Id) 错误

    我试图在我的 Xcode 项目中使用 glew 但我得到了这个 Apple Mach O Linker Id Error Undefined symbols for architecture x86 64 我正在使用从他们下载的最新版本的g
  • Protocol buffers 从原始消息中检测类型

    是否可以检测原始协议缓冲区消息的类型 以字节 为单位 我遇到的情况是端点可以接收不同的消息 并且我需要能够在反序列化之前检测到类型 我正在使用 protobuf net 您无法单独检测类型 因为 protobuf 规范不会为此向流添加任何数