从proto文件生成C#,反之亦然,解释自定义选项
我正在使用,我正在尝试:从proto文件生成C#,反之亦然,解释自定义选项,c#,code-generation,protocol-buffers,protobuf-net,C#,Code Generation,Protocol Buffers,Protobuf Net,我正在使用,我正在尝试: 从.proto文件生成C#类 从C#类生成.proto文件 这很容易使用: protogen.exe工具 Serializer.GetProto()方法 但问题是我需要支持protobuffer,而且它似乎不像我想象的那么简单 让我解释一下: 从包含应用于消息和字段的自定义选项的原型文件中,我想生成一个由.NET自定义属性修饰的C#类 从一个由自定义属性修饰的C#类中,我想生成一个proto文件,其中自定义选项应用于消息和字段 基本上,考虑到: message pers
protogen.exe
工具Serializer.GetProto()
方法message person {
option (my_message_option) = true;
optional string firstname = 1 [(my_field_option) = 42];
optional string lastname = 2 [(my_field_option) = 12];
optional int age = 3;
}
我想生成:
[ProtoContract, MyMessageOption(true)]
public class Person
{
[ProtoMember(1), MyFieldOption(42)]
public string Firstname;
[ProtoMember(2), MyFieldOption(12)]
public string Firstname;
[ProtoMember(3)]
public string Firstname;
}
…反之亦然
注:
- 自定义选项定义
(
和my_message_选项
)可以已经存在 在原型文件中(例如, my_custom_options.proto)和 自定义属性类也可以 存在于某处 (我的字段\u选项
和MyMessageOptionAttribute
)MyFieldOptionAttribute
- 我尝试使用protogen.exe和 自定义xslt,但protogen似乎没有 支持自定义选项
实现这一目标的首选方法是什么解决方案不必依赖protobuf网络。目前没有一种简单的方法可以做到这一点。所需的更改主要是csharp.xslt文件。这方面有一个bug,但尚未修复。我最终从中派生了ProtoGen项目,以公开一些内部类型(大部分是生成器),并通过允许自定义生成器注册来扩展
SourceGenerators
这样,我就能够使用proto描述符对象模型来编写自己的C#生成器
一个棘手的问题是在启动解析之前注册自定义选项类型:
Protoc.exe
然后使用ProtoGen.exe
)registeralExchanges
方法配置ExtensionRegistry
描述符.Options
集合我已经尝试创建一个特定的xslt文件,但无法访问proto文件中使用的自定义选项。你能想出另一种基于非protobuf网络的解决方案吗?@Romain这不是我有机会看到的配置,所以:不是我想的,不是。如果你通过xml模板(
-t:xml
或类似的东西)运行它,它会告诉你它知道什么,这可能表明这些数据隐藏在哪里——假设它不需要对描述符进行更新。是的,这就是我尝试的(-t:xml
),但所有自定义选项在生成的xml文件中都显示为unexported_option
。我想做同样的事情,从一个原型文件生成一个修饰的C#文件(用于protobuf net)。你能举例说明你是如何做到这一点的吗?谢谢