C# 从多个文件中创建一个.proto文件

C# 从多个文件中创建一个.proto文件,c#,protocol-buffers,protobuf-net,C#,Protocol Buffers,Protobuf Net,我们一直在使用Serializer.GetProto()为十几条消息生成proto定义。我们希望将所有定义合并到一个.proto文件中,以便更容易地查看我们发送的消息。但是,我无法找到合并输出的方法。最大的问题是在多条消息中使用一个POCO时(如下面示例中的Person)。有没有办法将多个.proto定义合并为一个定义 或者,Serializer.GetProto()是用于此作业的错误工具,而其他工具已经执行了此操作 使用protobuf net v2.0.0.668 最小示例(摘要:类部门和

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

或者,
Serializer.GetProto()
是用于此作业的错误工具,而其他工具已经执行了此操作

使用protobuf net v2.0.0.668


最小示例(摘要:类<代码>部门<代码>和<代码>订单<代码>都包含类<代码>人员<代码>,为<代码>部门<代码>和<代码>订单<代码>生成原型定义):

类程序
{
公共静态void Main(字符串[]args)
{
string departmentProto=Serializer.GetProto();
字符串orderProto=Serializer.GetProto();
控制台。WriteLine(部门协议);
Console.WriteLine(orderProto);
Console.ReadKey();
}
}
[数据合同]
公共阶层人士
{
[数据成员(顺序=1)]
公共字符串名{get;set;}
[数据成员(顺序=2)]
公共字符串LastName{get;set;}
}
[数据合同]
公共课系
{
[数据成员(顺序=1)]
公共字符串名称{get;set;}
[数据成员(顺序=2)]
公共人物[]员工{get;set;}
}
[数据合同]
公共阶级秩序
{
[数据成员(顺序=1)]
公共字符串ItemOrdered{get;set;}
[数据成员(顺序=2)]
公众客户{get;set;}
}
实际产量:

软件包控制台应用程序1;
信息部{
可选字符串名称=1;
重复人员=2人;
}
信息员{
可选字符串FirstName=1;
重复字符串LastName=2;
}
软件包控制台应用程序1;
消息顺序{
可选字符串ItemOrdered=1;
重复个人客户=2;
}
message Person{
GetProto()
假设您的模型将有一个单一的根类型,可以满足您的所有需要。如果没有,您可以发明一个伪类型,将您关心的所有类型都作为属性。即使您从未使用过它,也可以在
GetProto()中使用该类型
获取复合模型文件。不理想,但其他选项包括:

  • 手工合并
  • 更改代码

2017年还是这样吗?@Evk是的,.proto-emit代码已经更新以处理proto3,但是API目前仍然使用单个类型作为主要输入;我想添加一个使用数组的重载可能并不难,尽管-IIRC基本上是一个队列,所以如果我一开始就将多个类型排队,它将d可能会得到正确的输出是的,那将是非常棒的。我有完全相同的用例(我需要为javascript用户生成许多消息的.proto文件),我认为这并不少见(甚至比从单个根生成.proto更常见)。
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; }
}