尝试用Protobuf编码消息时出现错误



Protobuf generated:

# source: event.proto
require 'google/protobuf'
Google::Protobuf::DescriptorPool.generated_pool.build do
add_file("event.proto", :syntax => :proto3) do
add_message "myapp.Event" do
optional :name, :string, 1
optional :entity, :enum, 2, "myapp.Event.Entity"
oneof :event_data do
optional :first_event_data, :message, 3, "myapp.Event.FirstEventData"
optional :second_event_data, :message, 4, "myapp.Event.SecondEventData"
end
end
add_message "myapp.Event.FirstEventData" do
optional :id, :string, 1
optional :to, :string, 2
optional :from, :string, 3
end
add_message "myapp.Event.SecondEventData" do
optional :metadata_url, :string, 1
end
add_enum "myapp.Event.Entity" do
value :FIRST, 0
value :SECOND, 1
end
end
end
module Myapp
Event = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("myapp.Event").msgclass
Event::FirstEventData = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("myapp.Event.FirstEventData").msgclass
Event::SecondEventData = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("myapp.Event.SecondEventData").msgclass
Event::Entity = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("myapp.Event.Entity").enummodule
end

现在在控制台中,当我执行

message = Myapp::Event.new(
entity: :SECOND, 
name: "started",
event_data: {
second_event_data: 
Myapp::Event::SecondEventData.new(
metadata_url: "local-dev-url",
)
}
)

我得到这个错误:

Traceback (most recent call last):
3: from (irb):178
2: from (irb):178:in `new'
1: from (irb):178:in `initialize'
ArgumentError (Unknown field name 'event_data' in initialization map entry.)

我尝试了不同的组合,每次都有不同的错误,我认为我的message组织错误。

任何帮助都将非常感激。由于

好吧,经过大量的研究,显然我不能一下子做到这一点。我需要创建2或3个独立的对象:即

message = Myapp::Event.new(
entity: :SECOND, 
name: "started")

然后我可以这样写:

message.second_event_data = Myapp::Event::SecondEventData.new(
metadata_url: "local-dev-url",
)

当我对它进行编码时,second_event_data将位于event_data

之下

相关内容