【问题标题】:Create one .proto file from several从多个创建一个 .proto 文件
【发布时间】:2015-01-05 21:51:38
【问题描述】:

我们一直在使用Serializer.GetProto<T>() 为十几条消息生成原型定义。我们希望将所有定义合并到一个 .proto 文件中,以便更轻松地查看我们发送的消息。但是我找不到合并输出的方法。最大的问题是当一个 POCO 用于多条消息时(如下例中的Person)。有没有办法将多个 .proto 定义合并为一个定义?

或者Serializer.GetProto<T>() 是用于这项工作的错误工具,而其他东西已经在这样做了?

使用 protobuf-net v2.0.0.668。


最小示例(总结:类DepartmentOrder 都包含类Person,为DepartmentOrder 生成原型定义):
class Program
{
  public static void Main(string[] args)
  {
    string departmentProto = Serializer.GetProto<Department>();
    string orderProto = Serializer.GetProto<Order>();

    Console.WriteLine(departmentProto);
    Console.WriteLine(orderProto);
    Console.ReadKey();
  }
}

[DataContract]
public class Person
{
  [DataMember(Order = 1)]
  public string FirstName { get; set; }

  [DataMember(Order = 2)]
  public string LastName { get; set; }
}

[DataContract]
public class Department
{
  [DataMember(Order = 1)]
  public string Name { get; set; }

  [DataMember(Order = 2)]
  public Person[] Employees { get; set; }
}

[DataContract]
public class Order
{
  [DataMember(Order = 1)]
  public string ItemOrdered { get; set; }

  [DataMember(Order = 2)]
  public Person Customer { get; set; }
}

实际输出:

package ConsoleApplication1;
message Department {
  optional string Name = 1;
  repeated Person Employees = 2;
}
message Person {
  optional string FirstName = 1;
  repeated string LastName = 2;
}

package ConsoleApplication1;
message Order {
  optional string ItemOrdered = 1;
  repeated Person Customer = 2;
}
message Person {                  <-- Person is repeated
  optional string FirstName = 1;
  repeated string LastName = 2;
}

期望的输出:

package ConsoleApplication1;
message Department {
  optional string Name = 1;
  repeated Person Employees = 2;
}
message Order {
  optional string ItemOrdered = 1;
  repeated Person Customer = 2;
}
message Person {                  <-- Person only appears once
  optional string FirstName = 1;
  repeated string LastName = 2;
}

【问题讨论】:

    标签: c# protocol-buffers protobuf-net


    【解决方案1】:

    GetProto() 假设您的模型将有一个单一的根类型,它涉及您需要的所有内容。如果你没有那个,你可以发明一个假的类型,它拥有你关心的所有类型作为属性。即使您从未使用过它,您也可以在GetProto() 中使用该类型来获取复合模型文件。不理想,但其他选项是:

    • 手动合并
    • 更改代码

    【讨论】:

    • 2017年还是这样吗?
    • @Evk 是的; .proto 发出代码已更新以处理 proto3,但 API 当前仍将单一类型作为主要输入;我它可能不会很难添加一个带数组的重载,但是-IIRC它基本上作为一个队列工作,所以如果我在一开始就将多种类型排入队列,它会可能得到正确的输出
    • 是的,那真的很棒。我有完全相同的用例(我需要为 javascript 消费者生成 .proto 文件的大量消息),我认为这并不少见(甚至比从单个根生成 .proto 更常见)。
    猜你喜欢
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 2016-03-08
    • 2020-07-20
    相关资源
    最近更新 更多