从几个创建一个.proto文件

时间:2014-12-18 14:52:13

标签: c# protocol-buffers protobuf-net

我们一直在使用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;
}

1 个答案:

答案 0 :(得分:2)

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

  • 手工合并
  • 更改代码