protobuf-net - protogen命令行参数

问题描述 投票:1回答:1

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

[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个回答
1
投票

首先:请注意,download here可以使用原生质。

现在; re IExtensible:这实际上是故意的,是为了匹配最初的Google v3。*行为 - 其中不再保留未知字段(v2。*行为)。不过,现在这种行为再次发生了变化 - 来自于Google代码的protobuf v3.5.0(2017年11月13日):未知领域再次被保留。我只需要用这个事实更新protogen。如果这对你很重要,我可以很快完成这项工作 - 这只是意味着在if第217和224行删除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() {}
}

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

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.