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

6
我有一个通用的类库,其中包含许多服务器和客户端模型。由于客户端在Xamarin下运行,所以通用库必须是可移植类库(PCL)。
在我的服务器中,这些对象通过AppDomain Remoting / Marshaling传递,因此据我了解,对象需要标记为[Serializable]或继承自MarshalByRefObject之一。
由于处于PCL中,我不能对任何模型执行这些操作。
我的问题是:如何使这些对象与AppDomain Remoting / Marshaling配合使用,并让它们驻留在可移植类库中?

你真的需要将它们序列化为二进制对象吗?将它们转换为JSON或XML是否能够满足您的需求,以便避免这个问题? - mason
序列化是由代理对象自动完成的,超出了我的控制。 - Adam Schiavone
1个回答

10

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

然后,当你在普通的.NET桌面应用程序中使用你的PCL库时,对PCL CSShim的引用将被替换为对.NET版本的CSShim的引用,使用所谓的"bait-and-switch"技术。.NET版本会使用[TypeForwardedTo][Serializable]的调用转发到mscorlib中的.NET实现。

CSShim目前可从NuGet获取,针对.NET Framework 4.5及更高版本、Windows 8及更高版本、Windows Phone 8.1、Windows Phone Silverlight 8及更高版本、Xamarin Android和Xamarin iOS的PCL配置文件259。

CSShim源代码可在Github上获得。如果PCL库仅针对.NET 4.5及更高版本,则理论上可以将PCL库重新定位到.NET Framework 4配置文件(例如配置文件328),但重新定位可能会“颠簸” :-)

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


1
运行得非常好。感觉就像有一个库可以为.NET做几乎任何事情。 - Adam Schiavone
原则上,是的,这个库可以非常扩展,以覆盖更大部分的.NET。然而,在开发这个库时,我只专注于自己的需求,以便更好地支持AForge.NETAccord.NETEncogfo-dicom的PCL:ification。但我非常欢迎所有用户做出贡献,帮助进一步扩展这个库。 - Anders Gustafsson
顺便提一下,关于二进制序列化和PCL,有一个限制,涉及到[OnSerializing]等属性。请参阅此SO question获取更多信息。希望这不会成为您的问题。 - Anders Gustafsson
你说得对,我不认为这真的关系到我,但还是谢谢你的考虑! - Adam Schiavone
当我调用System.IO中的内容时,我会收到System.PlatformNotSupportedException: 'PCL'错误,我该怎么使用它?编辑:啊哈,好的,这是旧代码的虚拟实现? - Alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接