我正在使用protobuf-net,而我正在尝试:
分别使用它很容易:
protogen.exe
工具Serializer<T>.GetProto()
方法但问题是我需要支持protobuffer custom options并且它似乎并不像我那样直截了当。
让我解释一下:
基本上,给定:
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
)已经存在
在一个protofile(说,
my_custom_options.proto)和
自定义属性类也可以
存在于某个地方
(MyMessageOptionAttribute
和
MyFieldOptionAttribute
)。实现这一目标的首选方式是什么? 解决方案不必依赖protobuf-net。
答案 0 :(得分:2)
我最终通过从protobuf-csharp分配ProtoGen项目来公开一些内部类型(生成器,大部分),并通过允许自定义生成器注册使SourceGenerators
可扩展。
这样,我就可以使用proto描述符对象模型来编写自己的C#生成器。
一个棘手的问题是在启动解析之前注册自定义选项类型:
Protoc.exe
然后ProtoGen.exe
)ExtensionRegistry
方法配置RegisterAllExtensions
。Descriptor.Options
集合。答案 1 :(得分:1)
目前没有一种简单的方法可以做到这一点。所需的更改主要是csharp.xslt文件。有一个关于此的错误reported但尚未修复。