【问题标题】:Moving from WCF to gRPC, replacing NetDataContractSerializer从 WCF 迁移到 gRPC,替换 NetDataContractSerializer
【发布时间】:2020-12-04 03:12:53
【问题描述】:

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

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

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

但我想知道:

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

【问题讨论】:

  • 有关将 WCF 解决方案迁移到 gRPC 的信息,您可以参考此链接:docs.microsoft.com/en-us/dotnet/architecture/…
  • 对于与 WCF 的 NetDataContractSerializer 相同的序列化体验,您可以使用 github.com/neuecc/MessagePack-CSharp 或提到的 NewtonsoftJSON(但您必须处理 int/float/guid 反序列化问题)。 MessagePack 2.2.85 版本允许通过无类型序列化器使用默认设置序列化/反序列化接口实现类,而不会抛出异常。

标签: c# wcf json.net grpc netdatacontractserializer


【解决方案1】:

在“3”上,gRPC 实际上对您更换序列化程序非常开放;您不受 protobuf 的约束,但 gRPC通常与 protobuf 一起使用。事实上,您实际上可以使用NetDataContractSerializer,尽管出于我会谈到的原因:我不推荐它。

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

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

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

这是什么?

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

它默认为 protobuf-net,它是为代码优先场景设计的替代 protobuf 序列化程序,但您可以替换序列化程序(全局或针对单个类型)。实现自定义序列化程序绑定的示例是provided here - 请注意,该文件的大部分 是一个大注释(实际的序列化程序代码在末尾是 8 行)。请阅读这些 cmets:它们名义上是关于 BinaryFormatter,但它们中的每一个字都同样适用于 NetDataContractSerializer

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

【讨论】:

  • 您好,谢谢您的回答。我对第三个库的恐惧来自于我依赖非商业或爱好 DLL 时的一些经验,这些 DLL 被废弃并且我被它们困住了。此外,在使用 MS 库时,我对向后兼容性感到更舒服。
  • @user2126375 如果有帮助:protobuf-net(以及扩展名:protobuf-net.Grpc)是in the .NET foundation,其目的恰恰是意味着如果我可以让其他人随时接管走开,但是:由你决定
猜你喜欢
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多