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

标签 c# serialization appdomain portable-class-library

我有一个公共(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/

相关文章:

C# - 使用包含字符串数组的字符串

javascript - 使用 Google V8 实现最快的 Javascript 对象序列化

python - 在使用 django restframework 多数据库时,serializer.is_valid() 总是去默认数据库进行验证

c# - 以编程方式查找 ASP.NET 工作进程和应用程序域上次启动的时间?

c# - Application Insights 的日志未写入跟踪日志

c# - 将 Sprite x,y, width, height 转换为视口(viewport)矩形

java - 在 Java 中序列化 Canvas 对象

c# - 如何避免 SerializationException : Type is not resolved for member XXX when testing a component that uses the LogicalCallContext

c# - 如何在没有 AppDomain.GetCurrentThreadId() 的情况下获取当前线程 ID,使其真正起作用?

c# - Windows 8 应用程序 : "Snapping" Drag and Drop for Card Game