【问题标题】:protobuf-net - protogen command line argumentsprotobuf-net - protogen 命令行参数
【发布时间】:2018-03-01 11:29:17
【问题描述】:

我正在尝试从 .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; }
        }
...
}

【问题讨论】:

    标签: protobuf-net protogen


    【解决方案1】:

    首先:注意 protogen 可用于download here

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

    理论上,您实际上也可以在自己的代码中继承 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() {}
    }
    

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

    【讨论】:

    • 感谢马克的快速回复。就我而言,我只是希望使用 protogen 从外部提供给我们的 .proto 文件生成 .cs 文件,因此几乎可以用作黑匣子。如果您可以按照建议进行更新 - 确实非常感谢 - 感谢 Conleth
    • @ConlethMackle 现在应该在那里
    • 谢谢 Marc - 看起来像我需要的东西 - 非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 2011-02-25
    • 2013-02-14
    相关资源
    最近更新 更多