Protocol buffers 在gRPC/proto3中设置请求之一的更有效方法
在PHP客户端和Python服务器上使用此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 {
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
需要采取的额外步骤。谢谢你的回答!