1

我正在尝试从 .proto 文件生成 csharp (.cs) 文件。我从 github 下载了 protobuf-net 并在本地构建,这样我就可以使用 protogen 生成 .cs 文件。我的问题是,我希望它采用生成输出的 API 的先前版本的格式,例如,新生成的类不是从 ProtoBuf.IExtensible 继承的,而先前的版本确实从 ProtoBuf.IExtensible 继承。例如 protogen 正在生成:

[global::ProtoBuf.ProtoContract()]
    public partial class ClientMsg
    {
        [global::ProtoBuf.ProtoMember(100)]
        public Logon logon { get; set; }
        ...
    } 

我想要的是:

    [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"ClientMsg")]
    public partial class ClientMsg : global::ProtoBuf.IExtensible
    {
        public ClientMsg() {}


        private WebAPI_1.Logon _logon = null;
        [global::ProtoBuf.ProtoMember(100, IsRequired = false, Name=@"logon", DataFormat = global::ProtoBuf.DataFormat.Default)]
        [global::System.ComponentModel.DefaultValue(null)]
        public WebAPI_1.Logon logon
        {
          get { return _logon; }
          set { _logon = value; }
        }
...
}
4

1 回答 1

1

首先:请注意,protogen 可在此处下载

现在; 回复IExtensible:这实际上是故意的,是为了匹配原始的 Google v3.* 行为 - 不再保留未知字段(v2.* 行为)。不过,这种行为现在再次发生了变化- 从 Google 代码的 protobuf v3.5.0(2017 年 11 月 13 日)开始:再次保留了未知字段。我只需要用这个事实更新 protogen。如果这对您很重要,我可能会很快完成 - 这只是意味着删除第217 和 224 行中的if测试。CSharpCodeGenerator

从理论上讲,您实际上也可以从您自己的代码中继承CSharpCodeGenerator,但是现在使用自定义生成器的 API 并非易事。

没有命令行选项可以发出与以前版本完全相同的代码,我不打算添加一个。有一个切换 C# 语言版本的开关(使用低级 C#):例如+langver=3命令行中,或者它可以嵌入到 .proto 中:

import "protobuf-net/protogen.proto";
option (.protobuf_net.fileopt).csharp_langver = "3";

请注意,由于这是一个partial class,您还可以在单​​独的代码文件中添加其他代码,而无需编辑生成的代码。例如,在您自己的 .cs 文件中,您可以拥有:

[Serializable]
partial class ClientMsg {
    public ClientMsg() {}
}

添加额外的属性和显式构造函数。

于 2018-03-01T12:12:41.900 回答