protobuf-net - protogen 命令行参数
protobuf-net - protogen command line arguments
我正在尝试从 .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; }
}
...
}
首先:请注意,protogen 可用于 download here。
现在; re IExtensible
:这实际上是故意的,是为了匹配原始的 Google v3.* 行为 - 未知字段不再保留(v2.* 行为)。此行为现在 再次更改 ,不过 - 来自 Google 代码的 protobuf v3.5.0(2017 年 11 月 13 日):未知字段再次被保留。我只需要用这个事实更新 protogen。如果这对你很重要,我可能会很快完成这项工作 - 这只是意味着删除 CSharpCodeGenerator
第 217 和 224 行中的 if
测试。
理论上,您实际上也可以在自己的代码中从 CSharpCodeGenerator
继承 ,但是 API 使用自定义生成器并非易事现在。
没有command-line选项可以发出与以前版本完全相同的代码,我不打算添加一个。有是一个切换C#语言版本的开关(使用down-levelC#):例如在命令行的+langver=3
,或者它可以嵌入到一个.proto:
import "protobuf-net/protogen.proto";
option (.protobuf_net.fileopt).csharp_langver = "3";
请注意,由于这是 partial class
,您还可以在单独的代码文件中添加 其他 代码,而无需编辑生成的代码。例如,在您自己的 .cs 文件中,您可以:
[Serializable]
partial class ClientMsg {
public ClientMsg() {}
}
添加额外的属性和显式构造函数。
我正在尝试从 .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; }
}
...
}
首先:请注意,protogen 可用于 download here。
现在; re IExtensible
:这实际上是故意的,是为了匹配原始的 Google v3.* 行为 - 未知字段不再保留(v2.* 行为)。此行为现在 再次更改 ,不过 - 来自 Google 代码的 protobuf v3.5.0(2017 年 11 月 13 日):未知字段再次被保留。我只需要用这个事实更新 protogen。如果这对你很重要,我可能会很快完成这项工作 - 这只是意味着删除 CSharpCodeGenerator
第 217 和 224 行中的 if
测试。
理论上,您实际上也可以在自己的代码中从 CSharpCodeGenerator
继承 ,但是 API 使用自定义生成器并非易事现在。
没有command-line选项可以发出与以前版本完全相同的代码,我不打算添加一个。有是一个切换C#语言版本的开关(使用down-levelC#):例如在命令行的+langver=3
,或者它可以嵌入到一个.proto:
import "protobuf-net/protogen.proto";
option (.protobuf_net.fileopt).csharp_langver = "3";
请注意,由于这是 partial class
,您还可以在单独的代码文件中添加 其他 代码,而无需编辑生成的代码。例如,在您自己的 .cs 文件中,您可以:
[Serializable]
partial class ClientMsg {
public ClientMsg() {}
}
添加额外的属性和显式构造函数。