2009-02-03 17 views
24

Ho un progetto che utilizza BinaryFormatter per serializzare una raccolta di strutture con string e bool? tipi di dati.Deserializzazione binaria con diversa versione di assieme

La serializzazione/deserializzazione funziona bene, se dovessi cambiare il gruppo che fa il lavoro non riesce a deserializzare perché dell'intestazione nel file binario che indica che esso richiede Assembly x anziché Assembly y per gestire i dati.

È possibile impostare la serializzazione/deserializzazione come indipendente dall'assemblaggio?

+0

Sto avendo lo stesso problema ... felice di sapere che è stato risolto. – mmr

risposta

19

È possibile controllare il modo in cui il formattatore binario risolve i suoi tipi assegnando un SerializationBinder personalizzato al formattatore. In questo modo, non sarà necessario interferire con gli eventi risolutivi di AppDomain e si eliminerà il rischio di effetti collaterali imprevisti.

C'è un esempio dettagliato a MSDN.

+0

Grazie, sembra l'opzione più sicura, soprattutto se sposto il codice in un altro assieme ... –

+0

eccetto che non funziona (almeno per me ...) – mmr

+0

@mmr: l'ho appena testato e ottenuto funziona. Inizia con l'esempio MSDN nella risposta e modifica il raccoglitore di serializzazione per consentire la mancata corrispondenza della versione di assembly. – SteinNorheim

5

Hook nell'evento AppDomain.OnAssemblyResolve e Fix-up i nomi di assemblaggio

private System.Reflection.Assembly OnAssemblyResolve(System.Object sender, System.ResolveEventArgs reArgs) 
{ 
    foreach(System.Reflection.Assembly assembly in System.AppDomain.CurrentDomain.GetAssemblies()) 
    { 
     System.Reflection.AssemblyName assemblyName = assembly.GetName(); 
     if(assemblyName.FullName == reArgs.Name) 
     { 
       return(assembly); 
     } 
    } 
} 

fonte: http://osdir.com/ml/windows.devel.dotnet.clr/2003-12/msg00441.html

+0

Inizialmente usavo questo, tuttavia posso vedere che ci sono casi d'angolo che non funzionano male con l'esecuzione simultanea .. –

1

Il GAC è la tua prima risorsa, permettendo diverse versioni del gruppo di coesistere lato -di fianco. Ma questo non risolve nulla a meno che la tua app non sia tollerante per la versione. La serializzazione binaria ha diverse funzionalità per gestire la serializzazione tollerante della versione. Leggi in questo MSDN library article.

+0

Grazie per il suggerimento GAC, comunque sto cercando di non lasciare un ingombro pesante con l'App, avere tutto corri dalla sua cartella. –

3

Sono disponibili motori di serializzazione (binari) alternativi (like this) che non dipendono dall'assemblaggio.

+0

Buon vantaggio, grazie per tutto il duro lavoro su questo. – InteXX

11

È possibile modificare la proprietà BinaryFormatter AssemblyFormat per rendere la serializzazione indipendente dalla versione di assemblaggio.

// Example 
var binFormat = new BinaryFormatter(); 
binFormat.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple; 
+0

Funziona ma i dati devono essere serializzati e deserializzati usando lo stesso metodo. – dariol

+0

+1 funziona ed è la soluzione più semplice che io possa vedere – earcam

Problemi correlati