回答
您无法单独检测类型,因为protobuf规范不会将任何数据添加到此流;但是,也有一些使这个容易,这取决于上下文的方法:
- (如由Jon提到的)联合类型涉及一系列场景
- 继承(protobuf网专用)可以是多才多艺的 - 你可以有一个基本的消息类型,以及任意数量的具体信息类型的
- 您可以使用前缀指示输入型
最后的方法实际上是在原TCP的情况下非常有价值流;这是的网线与联合类型相同,但具有不同的实现;通过预先确定1 = Foo,2 = Bar等(与联合类型方法完全相同),可以使用SerializeWithLengthPrefix
来编写(指定1/2/etc作为字段编号),以及非通用TryDeserializeWithLengthPrefix
可以读取(这是在v1 API中的Serializer.NonGeneric下,或者在v2 API中的TypeModel中),您可以提供一个类型映射表,将数字解析为类型,然后反序列化正确的类型。并预先解决“为什么这对TCP流有用?”这个问题。 - 因为:在正在进行的TCP流中,您需要需要使用WithLengthPrefix
方法总之,以避免过度读取流;所以你不妨获得免费的类型标识符!
摘要:
- 联盟类型:易于实现;只有一边是不得不然后检查哪些属性是非空的
- 继承:易于实施;可以使用多态性或鉴别器来处理“现在什么?”
- 类型前缀:更繁琐一点来实现,但允许更大的灵活性,并具有零开销上的TCP流
嗨,感谢您的详细回复。 我设法使用Serializer.SerializeWithLengthPrefix&Serializer.NonGeneric.TryDeserializeWithLengthPrefix 完成所需的结果我想使用RuntimeTypeModel来避免我的类有属性。 Model.SerializeWithLengthPrefix似乎按预期工作,但我无法在RuntimeTypeModel上找到TryDeserializeWithLengthPrefix的等价性。 model.DeserializeWithLengthPrefix似乎期待一种类型。我应该如何使用模型完成TryDeserializeWithLengthPrefix的等价物。 使用版本2.0.0.480 nuget – 2012-02-03 10:18:40
我已更改我的代码以添加以将模型定义添加到RuntimeTypeModel.Default,并且我可以使用TryDeserializeWithLengthPrefix没有属性。在我使用TypeModel创建新模型之前创建 所以问题解决了谢谢 – 2012-02-03 11:11:13
@Yavor on TypeModel,它只是DeserializeWithLengthPrefix和TypeResolver。不确定尝试去了哪里!我会在沙发上的垫子后面寻找它 - 这是大多数情况下的结果。 – 2012-02-03 13:51:20
一个典型的选择是有包装的消息充当“选项类型”或可识别联合。您可以拥有一个枚举(每个消息类型一个)和一个包含消息类型字段的消息,然后每个消息类型都有一个可选字段。
这在Protobuf文档中描述为"union type"。
你可以把它包像这样。数据将保存实际的消息。
message MyCustomProtocol {
required int32 protocolVersion = 1;
required int32 messageType = 2;
bytes data = 3;
}
协议的一般规则是包含协议版本。一旦你有新老客户,你会很高兴拥有它。
- 1. 协议缓冲消息,并从XPathDocument的
- 2. C++类应该包含协议缓冲区消息还是从协议缓冲区消息构建/填充
- 3. 确定协议缓冲区消息类型的最佳实践
- 4. Google协议缓冲区,如何处理多个消息类型?
- 5. Java协议缓冲区 - 消息大小
- 6. 损坏的协议缓冲区消息
- 7. 如何检测协议缓冲区消息何时完全接收?
- 8. 使用RabbitMQ管理器排队协议缓冲区消息
- 9. 序列化和发送协议缓冲器消息
- 10. 如何使用Gson从json构建协议缓冲区消息?
- 11. 从iOS发送C++协议缓冲区消息
- 12. 如何判断序列化协议缓冲区中的消息类型?
- 13. 协议缓冲区 - 读所有消息的公共消息头(嵌套消息)
- 14. 协议缓冲区
- 15. 从c#到java的谷歌的协议缓冲区 - 协议消息标记有无效的线型
- 16. 从Java客户端向C++服务器发送协议缓冲区消息
- 17. 协议缓冲区精简版与常规协议缓冲区
- 18. 一个协议字段缓冲区作为另一个协议缓冲区字段的消息
- 19. 可用性的在proto3协议缓冲器“熟知类型的”
- 20. 在协议缓冲区消息中存储二进制数据缓冲区
- 21. 处理非常大的String消息的协议缓冲区?
- 22. 协议缓冲区c#(protobuf-net)消息::字节大小
- 23. 查看协议缓冲区消息文件
- 24. 谷歌协议缓冲区消息到字节数组C++(Windows)
- 25. 使用Google协议缓冲区多次反序列化消息
- 26. 协议缓冲无法解析具有消息
- 27. 显示协议缓冲区消息中的所有元素
- 28. 协议缓冲区作为消息过活动Mq
- 29. 通过Akka IO和套接字协议缓冲区消息
- 30. 扩展协议缓冲区
我只是使用多个端点。函数重载在编程语言中足够笨重,在网络服务中则少得多。 – millimoose 2012-02-02 23:32:25
谢谢,这是我的备份计划:) – 2012-02-02 23:34:33