.NET 可移植类库 [可序列化] 属性

本文关键字:序列化 属性 可移植 类库 NET | 更新日期: 2023-09-27 18:32:11

我有一个公共类库,其中包含许多用于服务器和客户端的模型。由于客户端在 Xamarin 下运行,因此公共库必须是可移植类库 (PCL)。

在我的服务器中,这些对象通过 AppDomain 远程处理/封送处理传递,因此据我了解,对象要么需要标记为[Serializable]要么从MarshalByRefObject继承

在 PCL 中,我无法对我的任何模型执行这些操作。

我的问题是:如何使这些对象与 AppDomain 远程处理/封送处理一起使用,并让它们驻留在可移植类库中?

.NET 可移植类库 [可序列化] 属性

我创建了一个名为CSShim的PCL支持库,其中包含一个"模拟"[Serializable]属性。如果此库是从 PCL 库中引用的,则可以在代码中使用[Serializable]

然后,当您在常规 .NET 桌面应用程序中使用 PCL 库时,使用所谓的"诱饵和切换"技术,将对 PCL CSShim 的引用替换为对 CSShim 的 .NET anolugue 的引用。.NET 类似物使用 [TypeForwardedTo][Serializable]的调用转发到 mscorlib 中的 .NET 实现。

CSShim目前可从NuGet for PCL profile 259获得,面向.NET Framework 4.5及更高版本,Windows 8及更高版本,Windows Phone 8.1,Windows Phone Silverlight 8及更高版本,Xamarin Android和Xamarin iOS。

CSShim源代码可在Github上找到。如果 PCL 库仅面向 .NET 4.5 及更高版本是一个限制,理论上可以将 PCL 库重新定位到 .NET Framework 4 配置文件(如配置文件 328),尽管重新定位可能是"艰难的旅程":-)

或者,您可以创建自己的 PCL 支持库,仅包含与SerializableAttribute相关的类型的"模拟"实现,并使用类型转发创建支持库的 .NET 类似物,以调用 .NET 核心程序集中的有效类型。我在这个StackOverflow答案中更详细地概述了这种方法。