2014-11-25 40 views
6

Ho una libreria di classi comuni contenente molti modelli per il mio server e il mio client. Poiché il client è in esecuzione in Xamarin, la libreria comune deve essere una libreria di classi portatili (PCL).Libreria di classi portatile .NET [Serializable] Attributo

Nel mio server, questi oggetti sono passati in giro con dominio di applicazione Remoting/Marshalling, per così la mia comprensione di un oggetto o deve essere contrassegnato come [Serializable] o ereditare da MarshalByRefObject

Essere in un PCL, non posso fare uno di queste cose a qualcuno dei miei modelli.

La mia domanda è: come posso far funzionare questi oggetti con AppDomain Remoting/Marshaling e lasciarli risiedere in una libreria di classi portatili?

+0

Hai davvero bisogno di serializzarli come un oggetto binario? La conversione in JSON o in XML funzionerebbe per i tuoi scopi in modo da poter evitare questo problema? – mason

+0

La serializzazione viene eseguita automaticamente dagli oggetti proxy. Fuori dal mio controllo –

risposta

10

Ho creato una libreria di supporto PCL denominata CSShim che contiene un attributo "simulato" [Serializable]. Se questa libreria fa riferimento da alla libreria PCL, è possibile utilizzare [Serializable] nel codice.

Poi, quando si consuma la libreria PCL in una normale applicazione .NET desktop, il riferimento al PCL CSShim viene sostituito con un riferimento al anolugue .NET di CSShim, utilizzando la cosiddetta tecnica "bait-and-switch" . L'analogo .NET inoltra l'invocazione di [Serializable] all'implementazione .NET in mscorlib utilizzando [TypeForwardedTo].

CSShim è attualmente disponibile da NuGet per il profilo PCL 259, il targeting di .NET Framework 4.5 e versioni successive, Windows 8 e superiori, Windows Phone 8.1, Windows Phone Silverlight 8 e superiori, Xamarin Android e iOS Xamarin.

CSShim il codice sorgente è disponibile su Github. Se si tratta di una limitazione che la libreria PCL ha come target solo .NET 4.5 e versioni successive, è possibile ridistribuire teoricamente la libreria PCL a un profilo .NET Framework 4 come il profilo 328, sebbene il re-targeting possa essere "un giro approssimativo": -)

In alternativa, è possibile creare la propria libreria di supporto PCL contenente solo implementazioni "simulate" dei tipi relativi a SerializableAttribute e creare un analogo .NET della libreria di supporto mediante l'inoltro di tipi per richiamare i tipi validi in. NET core assembly. Ho delineato questo approccio in modo più dettagliato nella risposta StackOverflow this.

+1

Ha funzionato come un fascino. Sembra che ci sia una libreria per fare quasi tutto per .NET –

+0

In linea di principio, sì, la libreria potrebbe essere molto estesa per coprire una parte più ampia di .NET. Quando ho sviluppato questa libreria, tuttavia, mi sono concentrato sulle mie esigenze per facilitare PCL: ificazione di * AForge.NET *, * Accord.NET *, * Encog * e * fo-dicom *. Ma incoraggio felicemente tutti i contributi degli utenti che possono aiutare a estendere ulteriormente la libreria. –

+0

A proposito, c'è una limitazione per quanto riguarda la serializzazione binaria e PCL, riguardo gli attributi '[OnSerializing]' ecc. Per favore guarda questo SO [domanda] (http://stackoverflow.com/q/20666731/650012) per maggiori informazioni. Spero che questo non sia un problema per te. –

Problemi correlati