从 proto 文件生成 C#,反之亦然解释自定义选项
Posted
技术标签:
【中文标题】从 proto 文件生成 C#,反之亦然解释自定义选项【英文标题】:Generate C# from proto files and vice versa interpreting custom options 【发布时间】:2011-03-28 11:43:54 【问题描述】:我正在使用protobuf-net,我正在尝试:
-
从 .proto 文件生成 C# 类
从 C# 类生成 .proto 文件
这很容易分别使用:
protogen.exe
工具
Serializer<T>.GetProto()
方法
但问题是我需要支持 protobuffer custom options,而且它似乎不像我那么简单。
让我解释一下:
-
从包含应用于消息和字段的自定义选项的 proto 文件中,我想生成一个由 .NET 自定义属性修饰的 C# 类。
从一个由自定义属性修饰的 C# 类,我想生成一个原型文件,其中自定义选项应用于消息和字段。
基本上,给定:
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_option
和
my_field_option
) 可能已经存在
在原型文件中(例如,
my_custom_options.proto),以及
自定义属性类也可以
存在于某处
(MyMessageOptionAttribute
和
MyFieldOptionAttribute
)。
我尝试使用 protogen.exe 和
自定义 xslt 但 protogen 似乎没有
支持自定义选项。
实现这一目标的首选方法是什么? 解决方案不必依赖 protobuf-net。
【问题讨论】:
我想做同样的事情,从 proto 文件生成修饰的 C# 文件(用于 protobuf-net)。你能举例说明你是如何做到这一点的吗?谢谢! 【参考方案1】:我最终从 protobuf-csharp 分叉了 ProtoGen 项目,以公开一些内部类型(大部分是生成器)并通过允许自定义生成器注册使 SourceGenerators
可扩展。
通过这种方式,我能够使用原型描述符对象模型来编写自己的 C# 生成器。
一个棘手的问题是在启动解析之前注册您的自定义选项类型:
-
根据您的自定义选项生成 C# 类型(使用
Protoc.exe
然后ProtoGen.exe
)
使用生成的RegisterAllExtensions
方法配置ExtensionRegistry
。
使用您自己的 C# 生成器开始代码生成。在每个生成器中,您都可以访问上下文 Descriptor.Options
集合。
【讨论】:
【参考方案2】:目前没有简单的方法可以做到这一点。所需的更改主要针对 csharp.xslt 文件。有一个关于此的错误reported,但尚未修复。
【讨论】:
我已经尝试创建一个特定的 xslt 文件,但我无法访问 proto 文件中使用的自定义选项。你能想到另一种不基于 protobuf-net 的解决方案吗? @Romain 这不是我有机会看到的配置,所以:不是我的头顶,不。如果你通过 xml 模板(-t:xml
或类似的东西)运行它,它会告诉你它知道什么,这可能表明这些数据潜伏在哪里 - 假设它不需要更新描述符。
是的,这就是我尝试过的 (-t:xml
),但所有自定义选项在生成的 xml 文件中都显示为 uninterpreted_option
。以上是关于从 proto 文件生成 C#,反之亦然解释自定义选项的主要内容,如果未能解决你的问题,请参考以下文章
在预构建事件中使用 protogen 从 .proto 文件生成 c# 文件
protobuf 下载编译,拷贝,proto文件生成c# c++代码
protobuf 下载编译,拷贝,proto文件生成c# c++代码