Protobuf-net:是否可以生成未映射到具体类型的RuntimeTypeModel?

时间:2014-04-17 11:04:08

标签: c# protobuf-net

我有一个使用protobuf与Web服务对话的Web应用程序。服务本身提供了获取.proto描述符的方法。

当我第一次解决这个问题时,我发现的唯一的protobuf库就是protobuf-net(最近我遇到了protobuf-csharp-port,但我马上就会谈到它)。这个库的文档非常有限,并且没有任何关于protobuf的先验知识,我最初采用的方法是自动生成所有的C#类和枚举(通过T4)应用“ProtoContract”和“ProtoMember”属性。

这很好但是我的网络应用程序非常脆弱。 Web应用程序充当正在开发的Web服务的多个版本的接口,因此需要优雅地处理更改。

进一步挖掘我发现如何动态生成TypeModel并将其绑定到我预先生成的类。 e.g。

RuntimeTypeModel model = TypeModel.Create();

model.Add(typeof (MyClass), false).Add(1, "Id").Add(2, "Name");

TypeModel compiledModel = model.Compile();

这确实成功地提高了应用程序对更改的稳健性,例如添加或删除可选字段(Web服务上的所有内容在合同方面都是可选的),但因为我仍然绑定到一个具体类型('预生成的MyClass'在上面的示例中),我仍然容易受到请求/响应模型名称更改的影响。

所以我的问题......有没有一种方法可以让protobuf-net生成一个没有耦合到我项目中任何具体类的TypeModel?

据我所知,google支持的C ++ / Java / Python库(带有动态消息?)这就是Web服务开发人员使用的内容,以及为什么他们希望重命名一个类不应该让我失望,但目前确实如此。

在使用protobuf-net搜索解决方案时,我遇到了protobuf-csharp-port项目,这是一个更接近googles的端口,似乎具有我需要的功能(虽然我真的不知道如何实现它在此刻)。因此,在进行所有切换库的工作之前,我认为通过protobuf-net检查我的需求是否可行是明智的。

有没有其他方法可以告诉TypeModel在没有绑定到具体类型的情况下使用哪个模型进行序列化/反序列化?例如。按名称,我可以从给定版本的Web服务器的描述符中获取。

提前感谢您的任何帮助或建议。

1 个答案:

答案 0 :(得分:0)

您当前宣布的MyClass在哪里?它来自哪里?需要明确的是:protobuf格式不包含名称,因此更改不同位置的名称无关紧要;但是,在您自己的代码是完全正常的,如果您重命名MyClass,则需要更新对MyClass的所有引用。 IDE工具通常可以帮助解决这个问题。

如果你有描述,我不确定你为什么要手动配置这个类:你不会只是从.proto生成代码(protogen)并使用它吗?