我们正在使用proto3创建一个grpc服务器。并将其编译成ruby函数。我们已经使用ActiveRecord-Protobuf gem将Active Record Message转换为protobuf消息(通过调用“activerecord”.to_proto方法获得)。然而,在创建protobuf消息以创建ruby服务器时,我们无法传递“activerecord”.to_proto消息,因为在定义输入值的类型时我们没有其他消息,而是将其定义为proto3中的消息,因此它只接受哈希值。为了我们必须将.to_proto对象转换为“activerecord”.to_proto.to_hash。这是徒劳的,降低了grpc的最优性。具有讽刺意味的是,我们正在转向grpc以获得最佳性。你能否建议如何定义protobuf消息(使用proto3)以确保“activerecord”.to_proto消息与proto3输入值定义兼容。
这是活动记录对象。
class AppPreferenceMessage < ::Protobuf::Message
optional ::Protobuf::Field::Int64Field, :id, 1
optional ::Protobuf::Field::StringField, :preference_key, 2
optional ::Protobuf::Field::StringField, :value, 3
optional ::Protobuf::Field::StringField, :value_type, 4
optional ::Protobuf::Field::Int64Field, :vaccount_id, 5
end
这将转换为AppPreference.last.to_proto,这是按类的protobuf消息。
我对ruby输入参数的protobuf定义如下。
syntax="proto3";
service App_Preferences{
rpc Index(Empty) returns (Index_Output){}
}
message Index_Output{
int64 id=1;
string preference_key=2;
string value=3;
string value_type=4;
int64 vaccount_id = 5;
}
此参数“Index_Output”仅接受AppPreference.last.to_proto.to_hash,但我希望它接受AppPreference.last.to_proto作为输入。我如何更改我的protobuf代码。
答案 0 :(得分:0)
我想您想将此AppPreferenceMessage对象转换为protobuf消息,然后将其传递给从单独的proto文件创建的rpc方法?另外我不熟悉AppPreferenceMessage.to_proto返回的内容,是序列化的字节吗?
我不确定我是否完全清楚,但听起来你可能不想使用grpc-protobuf存根和服务代码生成器,因为它们的设计考虑了ruby protobuf对象的传递。
https://github.com/grpc/grpc/tree/master/examples/ruby/without_protobuf中有一些例子,如果你需要跳过grpc-protobuf代码,可能会有用。