2009-02-03 11 views
24

Mam projekt, który używa BinaryFormatter do serializowania kolekcji struktur ze stringami i boolami? typy danych.Deserializacja binarna z inną wersją zestawu

Serializacja/deserializacji działa dobrze, jednak jeśli miałbym zmienić zespół, który działa zawiedzie deserializacji ze względu na cel w pliku binarnego, wskazując, że wymaga Assembly x zamiast Assembly y do obsługi danych.

Czy można ustawić szeregowanie/deserializację, aby było agnostyczne?

+0

Mam ten sam problem ... Cieszę się, że zostałem skierowany. – mmr

Odpowiedz

19

Możesz kontrolować, w jaki sposób formatator binarny rozwiązuje jego typy, przypisując niestandardowy identyfikator szeregowania do edytora. W ten sposób nie będziesz musiał zadzierać o zdarzeniach rozstrzygania AppDomain i wyeliminujesz ryzyko nieoczekiwanych skutków ubocznych.

Istnieje szczegółowy przykład pod adresem MSDN.

+0

Dzięki, wydaje mi się to najbezpieczniejszą opcją - szczególnie jeśli przeniesię kod do innego zespołu ... –

+0

poza tym, że to nie działa (przynajmniej dla mnie ...) – mmr

+0

@ mmr: Właśnie to przetestowałem i dostałem to działa. Rozpocznij od przykładu MSDN w odpowiedzi i zmodyfikuj sporzĘ ... dzenie do serializacji, aby umożliwić niedopasowanie wersji zestawu. – SteinNorheim

5

Hook w przypadku AppDomain.OnAssemblyResolve i Fix-up nazwami montażowych

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); 
     } 
    } 
} 

źródło: http://osdir.com/ml/windows.devel.dotnet.clr/2003-12/msg00441.html

+0

Początkowo zamierzałam użyć tego, jednak widzę, że są możliwe przypadki rażących problemów z jednoczesną realizacją .. –

1

GAC jest Twoja pierwsza zasobów, umożliwiając różne wersje montażu współistnieć bocznej -przy boku. Ale to naprawdę nie rozwiązuje niczego, chyba że twoja aplikacja jest również tolerancyjna dla wersji. Serializacja binarna ma kilka funkcji do obsługi serializacji z tolerancją wersji. Przeczytaj o tym w tym MSDN library article.

+0

Dziękuję za sugestię GAC, jednak staram się nie zostawiać ciężkiego śladu w aplikacji, mając wszystko uruchom z własnego folderu. –

3

Istnieją aliteracyjne (binarne) silniki do serializacji (like this), które nie są zależne od zespołu.

+0

Dobra przewaga, dziękuję za ciężką pracę nad tym. – InteXX

11

Możesz zmienić swoją właściwość BinaryFormatter AssemblyFormat, aby dokonać serializacji niezależnie od wersji zespołu.

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

Działa, ale dane powinny być serializowane i deserializowane przy użyciu tej samej metody. – dariol

+0

+1 to działa i jest najprostszym rozwiązaniem, jakie mogę zobaczyć – earcam