我有一个公共(public)类库,其中包含许多适用于我的服务器和客户端的模型。由于客户端在 Xamarin 下运行,因此公共(public)库必须是可移植类库 (PCL)。
在我的服务器中,这些对象通过 AppDomain Remoting/Marshaling 传递,因此据我了解,对象要么需要标记为 [Serializable]
,要么继承自 MarshalByRefObject
在 PCL 中,我不能对我的任何模型执行这些操作。
我的问题是:如何使这些对象与 AppDomain Remoting/Marshaling 一起工作并让它们驻留在可移植类库中?
最佳答案
我创建了一个名为 CSShim 的 PCL 支持库,其中包含一个“模拟”[Serializable]
属性。如果此库是从您的 PCL 库中引用的,您可以在代码中使用[Serializable]
。
然后,当您在常规 .NET 桌面应用程序中使用 PCL 库时,对 PCL CSShim 的引用将替换为对 CSShim 的 .NET 模拟的引用>,使用所谓的"bait-and-switch"技术。 .NET 类似物使用 [TypeForwardedTo]
将 [Serializable]
的调用转发到 mscorlib 中的 .NET 实现.
CSShim 目前可从 NuGet 获得适用于 PCL 配置文件 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 核心程序集中的类型。我在 this 中更详细地概述了这种方法。 StackOverflow 答案。
关于c# - .NET 可移植类库 [Serializable] 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27137141/