c# - 从 WCF 迁移到 gRPC,替换 NetDataContractSerializer
问题描述
作为从 WCF 迁移到 gRPC 的一部分,我正在处理NetDataContractSerializer,它用于在客户端序列化对象并在服务器端反序列化。客户端和服务器都与通信中使用的类型共享相同的 DLL。
作为客户端应用程序更新过程的一部分,从服务器下载具有新/更改/删除通信对象定义的共享 DLL 的实际版本。用于更新过程的基本通信对象永远不会改变。所以更新期间的序列化/反序列化工作。
我想尽可能少地重写现有代码。我发现我可以用NetDataContractSerializer
Newtonsoft 的 Json.NET 序列化替换,如下所述:
如何将 JSON 反序列化为正确类型的对象,而无需事先定义类型?在这里https://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm。
但我想知道是否:
- 一般有更好的解决方案吗?
- 是否有一些基于 .NET 框架 4.8 的一部分的解决方案,并且也可以在 .NET 5.0 中工作而无需参考第三方 DLL?
- 是否有一些二进制序列化替代方案对消息大小更友好/更快?我不必以可读的形式发送消息。
解决方案
在“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 软件包一起使用,但要让所有东西协同工作,需要做很多工作。
推荐阅读
- rust - Rust 从未来创造一个水槽
- node.js - 与 node.JS Express 开玩笑导致打开句柄错误
- docker - ErrImagePull 用于自定义 Kafka Connect 图像
- javascript - 如何在同一个 DOM 内的多个文本框中显示当前日期?
- ios - 想要保存核心数据,但“扩展不得包含存储的属性”
- python - 为什么这句话 if form.is_valid(): never pass。我尝试了很多东西,例如更改 python 版本并且总是相同
- python - SQLAlchemy 查询 filter_by 使用 OR
- sql - 查询可能很慢?
- flutter - 有问题 w/flutter mobx RadioListTile
- java - Apacher Hadoop , Apacher Hive on Apache Spark JAVA_9 common-lang 版本