27

BinaryFormatter を使用して構造体のコレクションを文字列とブール値でシリアル化するプロジェクトがありますか? データ型。

シリアライゼーション/デシリアライゼーションは正常に機能しますが、作業を行うアセンブリを変更すると、バイナリ ファイルのヘッダーがデータを処理するAssembly x代わりに必要であることを示しているため、デシリアライズに失敗しAssembly yます。

シリアライゼーション/デシリアライゼーションをアセンブリに依存しないようにセットアップすることは可能ですか?

4

5 に答える 5

22

カスタムの SerializationBinder をフォーマッタに割り当てることで、バイナリ フォーマッタがその型を解決する方法を制御できます。このようにして、AppDomain の解決イベントをいじる必要がなくなり、予期しない副作用のリスクを排除できます。

MSDNに詳細な例があります。

于 2009-02-03T20:38:48.737 に答える
12

BinaryFormatterプロパティAssemblyFormatを変更して、シリアル化をアセンブリのバージョンに依存しないようにすることができます。

// Example
var binFormat = new BinaryFormatter();
binFormat.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
于 2010-10-12T05:48:13.850 に答える
5

AppDomain.OnAssemblyResolve イベントにフックし、アセンブリ名を修正します。

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

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

于 2009-02-03T00:38:20.643 に答える
3

アセンブリに依存しない代替(バイナリ)シリアル化エンジン(このような)があります。

于 2009-02-03T01:40:44.260 に答える
1

GACは最初のリソースであり、アセンブリのさまざまなバージョンを並べて共存させることができます。しかし、アプリがバージョントレラントでない限り、それは実際には何も解決しません。バイナリシリアル化には、バージョントレラントなシリアル化を処理するためのいくつかの機能があります。このMSDNライブラリの記事でそれについて読んでください。

于 2009-02-03T01:06:08.747 に答える