使用protobuf-net生成C#时保留proto注释

我们使用protobuf-net来处理C#应用程序中的协议缓冲区需求.由于我们将.proto文件与其他非托管应用程序共享,因此我们从.proto文件生成代码(不使用代码优先的protobuf-net方法).为了尽可能保持DRY,我们在.proto文件中保留了很多接口文档.我们通过protogen.exe生成C#代码,由项目构建目标调用.

现在,有没有办法(自动)将这些注释转移到已编译的C#代码中?

基本上,给出一个像这样的.proto:

// This message is used to request a resource from the server
message GetResource
{
    // The identifier of the requested resource 
    required string resourceId = 1;
}

…我想要这样的东西(为了便于阅读,省略了IExtensible方法):

/// <summary>
/// This message is used to request a resource from the server
/// </summary>
[global::System.Serializable,global::ProtoBuf.ProtoContract(Name=@"GetResource")]
public partial class GetResource : global::ProtoBuf.IExtensible
{
    public GetResource() {}

    private string _resourceId;

    /// <summary>
    /// The identifier of the requested resource 
    /// [Required] <-- Would be nice...
    /// </summary>
    [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"resourceId", 
    DataFormat = global::ProtoBuf.DataFormat.Default)]
    public string ResourceId
    {
        get { return _resourceId; }
        set { _resourceId = value; }
    }
}
最佳答案
目前,我认为答案是“不”.据我所知,“protoc”(Google用于解析.proto文件的工具,在引擎盖下使用)会默默地丢弃注释 – 因此没有任何内容可供阅读.如果编写了自定义解析器,那么它是可能的,但是对于哪些注释适用于哪些行,还存在语言歧义,例如:

// this probably relates to resourceId
required string resourceId = 1;

required int foo = 2; // but... is this foo? or bar?
                      // and what about this?

       // what does this relate to? and why?

// and this? what are the rules?
required int bar = 3;

所以出于两个不同的原因:目前,没有.考虑所有建议,但是……特别是如果它们附带自定义解析器:)

请注意,由于这个原因,大多数(所有?)实现都缺少AFAIK此信息.不过,我很高兴得到纠正.

转载注明原文:使用protobuf-net生成C#时保留proto注释 - 代码日志