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; }
}