从 WCF 迁移到 gRPC,替换 NetDataContractSerializer

Moving from WCF to gRPC, replacing NetDataContractSerializer

作为从 WCF 迁移到 gRPC 的一部分,我正在处理 NetDataContractSerializer,它用于在客户端序列化对象并在服务器端反序列化。客户端和服务器都共享相同的 DLL 以及通信中使用的类型。

作为客户端应用程序更新过程的一部分,从服务器下载具有 new/changed/deleted 通信对象定义的共享 DLL 的实际版本。用于更新过程的基本通信对象永远不会改变。所以 serialization/deserialization 在更新期间有效。

我想尽可能少地重写现有代码。我发现我可以用 Newtonsoft 的 Json.NET 序列化替换 NetDataContractSerializer ,如下所述: How to deserialize JSON to objects of the correct type, without having to define the type before hand? and here https://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm.

但我想知道是否:

  1. 总体上有没有更好的解决方案?
  2. 是否有一些解决方案基于 .NET Framework 4.8 的一部分并且也可以在 .NET 5.0 中工作而无需引用第三方 DLL?
  3. 是否有一些二进制序列化替代方案对消息大小更友好/更快?我不必以可读的形式发送消息。

关于“3”,gRPC其实对你换出序列化器是很开放的;您未绑定到 protobuf,但 gRPC 通常 与 protobuf 一起使用。事实上,您实际上可以 使用 NetDataContractSerializer,尽管出于我将要说明的原因:我不推荐它。

这个“如何”很难解释,因为 经常 与 gRPC 的人使用 protoc 来生成所有的绑定,这隐藏了所有的细节(和将您与 protobuf 联系起来)。

可能 对 protobuf-net.grpc 感兴趣,这是绑定到 gRPC 的另一种方式(使用 Google 或 Microsoft 传输 -只是绑定不同),并且 与 WCF 相比 更具有可比性。事实上,它甚至允许您借用 WCF 的 interface/attribute 方法,尽管它没有为您提供与 WCF 相同的 like-for-like 功能(它仍然是 gRPC!)。

对于如何,一个getting started guide is here。开头一行设置上下文:

What is it?

Simple gRPC access in .NET Core 3+ and .NET Framework 4.6.1+ - think WCF, but over gRPC

它默认为 protobuf-net,这是为 code-first 场景设计的替代 protobuf 序列化程序,但您可以 替换序列化程序 (全局,或用于个别类型)。实现自定义序列化程序绑定的一个示例是 provided here - 请注意,该文件的 most 是一个大注释(实际的序列化程序代码在最后是 8 行左右)。请阅读这些评论:它们 名义上 关于 BinaryFormatter,但它们的每一个字都同样适用于 NetDataContractSerializer

我知道你说“不需要引用 third-party DLL”——在这种情况下,我的意思是肯定的:你可以有效地花几个星期来复制 protobuf-net 最直接明显的东西。 Grpc 正在为你做,但是......如果 NuGet 包只是坐在那里准备好使用的话,这听起来不像是在浪费你的时间。相关的 API 很容易与 Google/Microsoft 包一起使用,但是要让所有东西一起工作需要很多管道。