首页 > 解决方案 > 从 WCF 迁移到 gRPC,替换 NetDataContractSerializer

问题描述

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

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

我想尽可能少地重写现有代码。我发现我可以用NetDataContractSerializerNewtonsoft 的 Json.NET 序列化替换,如下所述: 如何将 JSON 反序列化为正确类型的对象,而无需事先定义类型?在这里https://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm

但我想知道是否:

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

标签: c#wcfjson.netgrpcnetdatacontractserializer

解决方案


在“3”处,gRPC 实际上对您更换序列化程序非常开放;你没有绑定到 protobuf,但 gRPC通常与 protobuf 一起使用。实际上,您实际上可以使用NetDataContractSerializer,尽管出于以下原因:我不推荐它。

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

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

对于如何,一个入门指南在这里。开场白设置了上下文:

它是什么?

.NET Core 3+ 和 .NET Framework 4.6.1+ 中的简单 gRPC 访问 - 考虑 WCF,但通过 gRPC

它默认为 protobuf-net,它是为代码优先场景设计的替代 protobuf 序列化程序,但您可以替换序列化程序(全局或针对单个类型)。此处提供了一个实现自定义序列化程序绑定的示例- 请注意,该文件的大部分内容是一个大注释(实际的序列化程序代码最后是 8 行)。请阅读这些评论:它们在概念上是关于BinaryFormatter,但它们中的每一个词都同样适用于NetDataContractSerializer

我意识到你说“不需要引用第三方 DLL”——在这种情况下,我的意思是肯定的:你可以有效地花几个星期来复制 protobuf-net.Grpc 为你做的最明显的事情,但是.. . 如果 NuGet 包只是坐在那里准备使用,这听起来不像是在充分利用您的时间。相关的 API 很容易与 Google/Microsoft 软件包一起使用,但要让所有东西协同工作,需要做很多工作。


推荐阅读