Protocol buffers 在gRPC/proto3中设置请求之一的更有效方法

Protocol buffers 在gRPC/proto3中设置请求之一的更有效方法,protocol-buffers,grpc,proto,proto3,Protocol Buffers,Grpc,Proto,Proto3,在PHP客户端和Python服务器上使用此proto3模式: service GetAnimalData{ rpc GetData (AnimalRequest) returns (AnimalData) {} } message AnimalRequest { OneOfAnimal TypeAnimal = 1; } message AnimalData { repeated int32 data = 1; } message OneOfAnimal {

在PHP客户端和Python服务器上使用此proto3模式:

service GetAnimalData{
    rpc GetData (AnimalRequest) returns (AnimalData) {}
}

message AnimalRequest {
    OneOfAnimal TypeAnimal = 1;
}

message AnimalData {
    repeated int32 data = 1;
}

message OneOfAnimal {
    oneof animal_oneof {
        CAT cat = 1;
        DOG dog = 2;
    }
}

message CAT{
    int32 p = 1;
    int32 d = 2;
    int32 q = 3;
}

message DOG{
    int32 p = 1;
    int32 d = 2;
    int32 q = 3;
    int32 p2 = 4;
    int32 d2 = 5;
    int32 q2 = 6;
}
为了设置来自PHP客户端的请求,我需要执行以下操作:

  • 创建一个新的
    CAT
  • 将动物的一个设置为猫
  • AnimalRequest.TypeAnimal
    设置为
    OneOfAnimal

  • proto3是否有一个模式,我可以直接将
    CAT
    DOG
    对象设置为我的
    AnimalRequest;不,不是真的

    在某些非常特定的情况下,答案是“是”-例如,protobuf net(在.net中的“代码优先”protobuf实现)恰好以这种方式实现继承,因此您可以使用:

    [协议]
    公共类动物请求{
    [原成员(1)]公共动物{get;set;}
    }
    [原始合同]
    [协议包括(1,类型(Cat))]
    [包括(2,类型(狗))]
    类Animal{}//的行为与您的Animal消息类型相同
    [原始合同]
    班猫{
    [ProtoMember(1)]公共int P{get;set;}
    [ProtoMember(2)]公共int D{get;set;}
    [ProtoMember(3)]公共int Q{get;set;}
    }
    [原始合同]
    班犬{
    [ProtoMember(1)]公共int P{get;set;}
    [ProtoMember(2)]公共int D{get;set;}
    [ProtoMember(3)]公共int Q{get;set;}
    [ProtoMember(4)]公共int P2{get;set;}
    [ProtoMember(5)]公共int D2{get;set;}
    [ProtoMember(6)]公共int Q2{get;set;}
    }
    
    然后你使用:

    var result=svc.GetData(
    新动物请求{动物=新狗{P=42,…Q2=19}
    );
    
    它将以完全相同的方式工作——发送相同的字节;基本上,protobuf net将继承视为
    中的一个(在类型层次结构的每个级别)


    但是:因为
    .proto
    旨在以一种非常通用的“最小公分母”的方式工作,
    .proto
    本身没有继承的概念,所以:你不能从
    .proto
    或谷歌库中这样做。

    哦,好吧,protobuf-net似乎是我期望的方式。这是不幸的,但无论如何,这只是
    .proto
    需要采取的额外步骤。谢谢你的回答!