【发布时间】:2014-04-17 11:04:07
【问题描述】:
我有一个使用 protobuf 与 Web 服务通信的 Web 应用程序。服务本身提供了获取 .proto 描述符的方法。
当我第一次解决这个问题时,我发现的唯一 protobuf 库是 protobuf-net(最近我遇到了 protobuf-csharp-port,但我稍后会谈到)。这个库的文档非常有限,并且没有任何关于 protobuf 的先验知识,我最初采用的方法是应用“ProtoContract”和“ProtoMember”属性自动(通过 T4)生成我的所有 C# 类和枚举。
这很好用,但让我的 Web 应用程序对更改非常脆弱。 Web 应用充当正在开发中的多个 Web 服务版本的接口,因此需要优雅地处理更改。
进一步挖掘,我发现了如何动态生成 TypeModel 并将其绑定到我的预生成类。例如
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 项目,它是谷歌的更接近的端口,并且似乎具有我需要的功能(虽然我真的不知道如何实现它在此刻)。因此,在进行所有切换库的工作之前,我认为使用 protobuf-net 检查我所需要的内容是否可行是谨慎的做法。
有没有其他方法可以告诉 TypeModel 使用哪个模型来序列化/反序列化而不绑定到具体类型?例如。我可以从给定版本的 Web 服务器的描述符中获取的名称。
提前感谢您的任何帮助或建议。
【问题讨论】:
标签: c# protobuf-net