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 实现可以将此表示为多态性,尽管这不是默认体验。