【问题标题】:.NET Portable Class Library [Serializable] Attribute.NET 可移植类库 [Serializable] 属性
【发布时间】:2014-11-25 21:34:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你真的需要将它们序列化为二进制对象吗?将它们转换为 JSON 或 XML 是否适合您的目的,这样您就可以避免这个问题?
  • 序列化是由代理对象自动完成的。不受我控制。

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


【解决方案1】:

我创建了一个名为 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 回答中更详细地概述了这种方法。

【讨论】:

  • 工作就像一个魅力。感觉就像有一个库可以为 .NET 做几乎任何事情
  • 原则上,是的,该库可以扩展很多,以覆盖 .NET 的更大部分。然而,当我开发这个库时,我专注于促进 PCL:AForge.NETAccord.NETEncogfo-dicom。但我很乐意鼓励所有有助于进一步扩展库的用户贡献。
  • 顺便说一下,关于二进制序列化和 PCL 有一个限制,涉及 [OnSerializing] 等属性。请参阅此 SO question 了解更多信息。希望这不是您担心的问题。
  • 你说得对,我认为这不是我真正关心的问题,但感谢您的考虑!
  • 我在 System.IO 中调用东西时得到 System.PlatformNotSupportedException: 'PCL',我该如何使用它?编辑:啊哈,它是遗留代码的虚拟实现?
猜你喜欢
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 2017-01-28
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
相关资源
最近更新 更多