2014-11-25 5 views
6

У меня есть общая библиотека классов, содержащая множество моделей для моего сервера и моего клиента. Поскольку клиент работает под Xamarin, общая библиотека должна быть Portable Class Library (PCL)..NET Portable Class Library [Serializable] Attribute

В моем сервере, эти объекты передаются вокруг с AppDomain Remoting/сортировочной, так к моему пониманию объекта либо должен быть помечен как [Serializable] или наследовать от MarshalByRefObject

Находясь в PCL, я не могу сделать что-либо из эти вещи к любой из моих моделей.

Мой вопрос: Как я могу заставить эти объекты работать с AppDomain Remoting/Marshaling и позволить им находиться в портативной библиотеке классов?

+0

Вам действительно нужно сериализовать их как двоичный объект? Преобразует их в JSON или XML для ваших целей, чтобы избежать этой проблемы? – mason

+0

Сериализация выполняется автоматически, через прокси-объекты. Из-под контроля. –

ответ

10

Я создал библиотеку поддержки PCL под названием CSShim, которая содержит атрибут «mock» [Serializable]. Если на эту библиотеку ссылаются от ваша библиотека PCL, вы можете использовать [Serializable] в своем коде.

Затем, когда вы потребляете вашу библиотеку PCL в обычном приложении .NET рабочего стола, ссылка на PCL CSShim заменяется ссылкой на .NET anolugue из CSShim, используя так называемый метод "bait-and-switch" , Аналог .NET перенаправляет вызов [Serializable] в реализацию .NET в mscorlib с использованием [TypeForwardedTo].

CSShim в настоящее время доступны для PCL NuGet профиль 259, нацеливание .NET Framework 4.5 и выше, Windows 8 и выше, Windows Phone 8.1, Windows Phone Silverlight 8 и выше, Xamarin Android и IOS Xamarin.

CSShim Исходный код доступен на Github. Если это ограничение на то, что библиотека PCL предназначена только для .NET 4.5 и выше, теоретически вы можете перенаправить библиотеку PCL в профиль .NET Framework 4, такой как профиль 328, хотя повторный таргетинг может быть «грубой поездкой»: -)

В качестве альтернативы вы можете создать свою собственную библиотеку поддержки PCL, содержащую только «макетные» реализации типов, связанных с SerializableAttribute, и создать .NET-аналог библиотеки поддержки, используя перенаправление типов для вызова допустимых типов в. NET. Я более подробно изложил этот подход в ответе this StackOverflow.

+1

Работал как шарм. Похоже, что библиотека theres делает почти что угодно для .NET. –

+0

В принципе, да, библиотека может быть очень распространена, чтобы охватить большую часть .NET. Когда я разработал эту библиотеку, я, однако, сосредоточился на собственных потребностях, чтобы облегчить PCL: ⇒ * AForge.NET *, * Accord.NET *, * Encog * и * fo-dicom *. Но я с радостью поощряю все вклады пользователей, которые могут помочь расширить библиотеку. –

+0

Кстати, существует одно ограничение в отношении двоичной сериализации и PCL, относящихся к атрибутам '[OnSerializing]' и т. Д. Пожалуйста, смотрите этот SO [вопрос] (http://stackoverflow.com/q/20666731/650012) для получения дополнительной информации. Надеюсь, это вас не беспокоит. –

Смежные вопросы