Protobuf 解组任意消息。 Protobuf 消息多态性
Protobuf unmarshal arbitrary messages. Protobuf message polymorphism
有一个通过 UDP 接受消息的 Go 服务器。使用这种设计,它只能扫描一种特定类型的实体,world.Entity
.
for {
buf := make([]byte, 1024)
n, addr, err := pc.ReadFrom(buf)
if err != nil {
log.Println(err)
continue
}
packet := &service.Packet{}
err = proto.Unmarshal(buf[:n], packet)
if err != nil {
log.Println(err)
continue
}
log.Println(packet)
go serve(pc, addr, buf[:n])
}
如何更改设计以允许发送不同类型的消息?原因是让这个 UDP 服务器像 REST API 一样工作。假设有一个 world.Packet
消息由一个枚举字段和另一个可以包含不同类型消息的字段组成。服务器检查枚举并根据它尝试解组消息,消息可以是多种类型。 Protobuf 中是否有可以实现此目的的工具?
我意识到这不是唯一的解决方案。一种更简单的方法(但更冗长)是为不同的“端点”(具有不同枚举字段的消息)制作不同类型的消息。还有其他解决方案吗?你觉得哪一个最好看?
在 protobuf 中,查看 oneof
。使用带有 oneof
字段的 single/common 外部消息,您可以自动处理所有预期的内部类型。一些 protobuf 实现可以将此表示为多态性,尽管这不是默认体验。
有一个通过 UDP 接受消息的 Go 服务器。使用这种设计,它只能扫描一种特定类型的实体,world.Entity
.
for {
buf := make([]byte, 1024)
n, addr, err := pc.ReadFrom(buf)
if err != nil {
log.Println(err)
continue
}
packet := &service.Packet{}
err = proto.Unmarshal(buf[:n], packet)
if err != nil {
log.Println(err)
continue
}
log.Println(packet)
go serve(pc, addr, buf[:n])
}
如何更改设计以允许发送不同类型的消息?原因是让这个 UDP 服务器像 REST API 一样工作。假设有一个 world.Packet
消息由一个枚举字段和另一个可以包含不同类型消息的字段组成。服务器检查枚举并根据它尝试解组消息,消息可以是多种类型。 Protobuf 中是否有可以实现此目的的工具?
我意识到这不是唯一的解决方案。一种更简单的方法(但更冗长)是为不同的“端点”(具有不同枚举字段的消息)制作不同类型的消息。还有其他解决方案吗?你觉得哪一个最好看?
在 protobuf 中,查看 oneof
。使用带有 oneof
字段的 single/common 外部消息,您可以自动处理所有预期的内部类型。一些 protobuf 实现可以将此表示为多态性,尽管这不是默认体验。