.NET可移植类库[Serializable]属性

时间:2014-11-25 21:34:57

标签: c# serialization appdomain portable-class-library

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

在我的服务器中,这些对象是通过AppDomain Remoting / Marshaling传递的,所以根据我的理解,对象需要标记为[Serializable]或继承自MarshalByRefObject

在PCL中,我不能对我的任何一个模型做任何这些事情。

我的问题是:如何让这些对象与AppDomain Remoting / Marshaling一起使用并让它们驻留在可移植类库中?

1 个答案:

答案 0 :(得分:10)

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

然后,当您在常规.NET桌面应用程序中使用PCL库时,对PCL CSShim 的引用将替换为对 CSShim 的.NET anolugue的引用>,使用所谓的"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支持库,其中仅包含" mock"与SerializableAttribute相关的类型的实现,并使用类型转发创建支持库的.NET模拟,以调用.NET核心程序集中的有效类型。我在this StackOverflow回答中更详细地概述了这种方法。