如何从 proto 文件中使用 ProtoGen 生成结构

Posted

技术标签:

【中文标题】如何从 proto 文件中使用 ProtoGen 生成结构【英文标题】:How to generate struct with ProtoGen from proto file 【发布时间】:2013-08-21 13:03:41 【问题描述】:

我们一直在使用 protobuf-net ProtoGen 从 *.proto 文件生成 C# .cs 文件。我们想代替类来生成结构。例如

[DataContract]
public struct Entity1

    [ProtoMember(1)]
    public double Field1  get; set; 

    [ProtoMember(2)]
    public string Field2  get; set; 

我尝试使用 Serializer.GetProto 方法提取协议缓冲区,用于类和结构类型。看来,协议缓冲区(.proto)无法识别结构和类之间的区别。所以我暗示,这可能是 ProtoGen 中的一个参数,用于在从 .proto 生成的类/结构之间进行选择。该功能是否存在或者我如何解决从 *.proto 生成结构的问题?

【问题讨论】:

为什么你特别需要struct @Lloyd 在 .NET 中,与类相比,结构不会带来额外的运行时和内存开销。例如,考虑 SharpDX 中 3D 矢量的定义。它被声明为一个包含 3 个字段的结构,而不是一个类。部分原因是因为您希望向量列表是 blittable,但另一个原因是,如果将向量声明为类,则分配大量(例如一百万项)向量数组会产生难以置信的内存开销。 【参考方案1】:

目前,ProtoGen 只发出类;由于数据本质上是可变的,我会说这是合理的,但是 - 有两种选择:

编辑csharp.xslt 以将class 替换为struct(或复制 csharp.xslt,并使用-t 参数告诉它使用副本) “按原样”使用它,并明智地使用 ctrl+h(我知道技术含量低;但它会起作用)

【讨论】:

这仍然应该在最新的 github 源上工作吗?尝试了一下,但我点击了throw new NotSupportedException("IExtensible is not supported in structs or classes with inheritance"); 好吧,没关系。删除结构类型上的 IExtensible 似乎工作正常。我决定手写 C# 代码而不是使用 protogen,因为我可以使用公共字段和结构而不是属性等。

以上是关于如何从 proto 文件中使用 ProtoGen 生成结构的主要内容,如果未能解决你的问题,请参考以下文章

[专栏作家] Protobuf-net使用ProtoGen批量转换成cs文件

如何在 proto 文件中表示接口实现

从 proto 文件生成 C#,反之亦然解释自定义选项

.proto 文件中带有 oneof 的 Protobuf-net

从 Proto 转换为 XSD

定义了protobuf-net序列化所需的proto2消息类型?