如何从使用属性修饰的C#类生成.proto文件?

Sté*_*écy 26 .net c# serialization protocol-buffers protobuf-net

试图让我的思绪围绕谷歌protobuf.我在C#中发现了一些protobuf的实现,但它们似乎缺少一个功能:能够从使用属性修饰的现有C#类自动生成.proto文件.

我想这样做而不是从.proto文件中自动生成的C#类的原因是因为我已经在我的项目中定义了C#类,我不想复制它们只是为了满足ProtoBuf.

有没有人遇到过这种情况?


更新

这可能只是装饰一个C#类而不是使用.proto文件来使用protobuf吗?

Mar*_*ell 32

好消息; 您所描述的(具有现有的C#类)是protobuf-net的预期用例.所有.proto的东西("protogen",VS插件等)都是作为事后添加的.protobuf-net的核心不了解它们或关心它们.

协议缓冲区定义了在实现之间共享的DSL(.proto,如你所提到的),并且(有时)用于代码生成.当我第一次编写protobuf-net时,代码生成方面并不是我最关心的问题 - 只是.NET开发人员通常对"先实现"而不是"合同优先"感到内疚(包括我自己).

因此,protobuf-net 不需要.proto文件来工作; 属性类足以明确地序列化/反序列化.只是使用Serializer.Serialize,.Merge.Deserialize(等).

那说; 它确实包括一些非常欠发达和实验性的支持:

string proto = Serializer.GetProto<YourType>();
Run Code Online (Sandbox Code Playgroud)

这远非完整,但可能适用于简单类型.如果您遇到某些特定情况,请告诉我(添加评论或记录问题).然而; 大多数时候,对.proto感兴趣的人会首先编写.proto 并从那里开始工作.

工作装饰类型的示例显示在项目主页上 ; 您是否使用WCF属性,xml属性或protobuf-net属性完全取决于您(尽管后者提供了对某些特定序列化点的更多控制,例如继承和数字布局).

  • @总的目的是不要在Google上打勾;我的目的是提供一种有用,方便且兼容的工具;如果您要一个.proto文件,则内置了导出该文件的功能,如答案所示。 (3认同)
  • 太好了,这将符合我的要求。然而,还有一件事,Protobuf-Net 是否实现了 Protobuf 的整个规范? (2认同)
  • @Marc Gravell - 为 protobuf“服务”生成 .proto 定义如何公平?我们正在向现有 Web 服务添加 protobuf-net 支持,因此我希望将该服务保留为“定义”,而不是从头开始创建 .proto。客户端不是 .NET,所以我们不能去 .proto-less (2认同)
  • Marc感谢您对.NET和Protobuf的大力支持,但是正如您所说的“ protobuf-net不需要.proto文件才能工作;属性类足以明确地进行序列化/反序列化”,这有点违反了规则。在其他平台上,没有其他不需要.proto文件的api。而且Google的定义也需要它,因此protobuf-net很酷且易于使用,带有属性,它打破了互操作性并指向使用protobuf。它的名称应更正为“ .net基于protobuf的序列化程序”,因为它不是创建者意图的protobuf。 (2认同)

小智 6

Skeet Marc进入这里并大幅度上升之前,让我指出protobuf.net。

  • 实际上,那将是我;-p (4认同)