20

BinaryFormatter を使用して、クラス インスタンスの配列をファイルにシリアル化しています。同じアプリケーション内でこの問題をデシリアライズできます。別のアプリケーション (作業を行う共通ファイルを取り込む) で同じ逆シリアル化を試みると、次のエラーが発生します。

{"Could not load file or assembly 'pmlscan, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The module was expected to contain an assembly manifest."}

ここで、pmlscan は元のアプリケーションの名前です。BinaryFormatter が pmlscan を読み込まないようにするにはどうすればよいですか?

4

5 に答える 5

20

カスタム SerializationBinder を使用して実現できます。こちらを参照してください:高度なバイナリ シリアライゼーション: シリアライズされたものとは異なる型へのオブジェクトのデシリアライズ

于 2011-09-23T20:58:40.320 に答える
3

クラスが同じで、それが単なる別のアセンブリである場合は、.config ファイルにassemblyBindingセクションを追加してみてください。

Resolving Assembly LoadsおよびTypeResolve イベントに関する記事もお読みください。

これらの手法を使用すると、逆シリアル化中に .Net 型システムを別の型にリダイレクトできます。

注:共有クラスを共有 .dll に移行すると、より簡単な解決策になります。

于 2010-11-16T12:58:25.700 に答える
3

バイナリ シリアライザーは、クラスとアセンブリの情報をバイナリ配列にエンコードします。この配列を逆シリアル化すると、デシリアライザーはこの情報を使用して、クラスが存在するアセンブリを特定し、(必要に応じて) アセンブリをアプリ ドメインに読み込みます。クラス型が存在するアセンブリに他のアプリケーションがアクセスできない場合は、取得しているエラーが表示されます。

別の投稿者が述べたように、これらの共通クラスを共有アセンブリに配置し、それらをクライアント/他のアプリケーションとサーバー アプリケーションに展開します。

于 2010-11-16T12:32:04.207 に答える
2
sealed class PreMergeToMergedDeserializationBinder : SerializationBinder
{
    public override Type BindToType(string assemblyName, string typeName)
    {
        return Type.GetType("BinarySerialization.YourClass");
    }
}
BinaryFormatter bfDeserialize = new BinaryFormatter();
bfDeserialize.Binder = new PreMergeToMergedDeserializationBinder();
while (fsRead.Position < fsRead.Length)
{
    YourClass sibla = (YourClass)bfDeserialize.Deserialize(fsRead);
}

「YourClass」のデータをシリアル化するexeと、YourClassオブジェクトを逆シリアル化する別のexeがあるとします。

于 2014-09-01T12:38:47.950 に答える
-1

それはいけません!

最良のオプションは、シリアル化可能なクラスを別のアセンブリで公開し、サーバー(シリアライザー)とクライアント(デシリアライザー)で参照することです。このようにして、ソースコード全体を外部に公開することはありません。

于 2010-11-16T12:14:59.167 に答える