12

そのため、このトピックに関するスレッドがたくさん見つかりましたが、まだ該当するスレッドは見つかっていないと思います。

基本的に、私の .exe は、シリアル化と読み込みを行う .dll (MyAssembly) ファイルを読み込みます。明らかに、それは非常にうまくシリアライズされます。

しかし、MyAssembly.dll ファイル内のファイルを逆シリアル化しようとすると、この投稿のタイトルにあるエラーで爆発します。

誰にもアイデアはありますか?コードを呼び出しているアセンブリが見つからない理由がわかりません!

私のコード:

// deserialize


 using (var target = new System.IO.FileStream(Path, System.IO.FileMode.OpenOrCreate))
 {
     var bin = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
     var Obj = bin.Deserialize(target);
     if (Obj != null)
     {
         ObjectToStore = (ObjectTypeInMyAssembly)Obj;
     }
 }

// serialize
 using (var target = new System.IO.FileStream(Path, System.IO.FileMode.OpenOrCreate))
 {
     var bin = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
     bin.Serialize(target, ObjectToStore);
 }
4

9 に答える 9

10

DLL は EXE と同じフォルダにありますか?
DLL ("MyAssembly") に存在するオブジェクトをシリアル化/逆シリアル化するようです。逆シリアル化すると、フォーマッタはシリアル化されたデータから型の名前を決定し、メインの実行可能フォルダー (EXE フォルダー) のアセンブリでこの型を見つけようとします。
解決策 - DLL を EXE フォルダに移動します。フォーマッタが別のアセンブリを検索し、イベントをキャプチャしAppDomain.AssemblyResolveて DLL を返すようにする方法があります。MSDNを参照してください。

于 2013-02-21T01:52:45.143 に答える
0

serialize と deserialize の両方でコードに表示されるのは、ファイルへの実際のパスの代わりに System.IO.Path クラスを使用していることです。私は通常、次のようにこれを実行します。

    static void Main(string[] args)
    {
        string filepath = @"C:\FileLocation\";
        string filename = "datasaved.bin";
        MyClass something = new MyClass();

        // serialize
        using ( FileStream strm = File.OpenWrite(Path.Combine(filepath, filename)))
        {
            BinaryFormatter ser = new BinaryFormatter();
            ser.Serialize(strm, something);
        }

        // deserialize
        using (FileStream strm = File.OpenRead(Path.Combine(filepath, filename)))
        {
            BinaryFormatter ser = new BinaryFormatter();
            something = ser.Deserialize(strm) as MyClass;
        }
    }

2 つの点に注意してください:オブジェクトが null であるか、期待される型ではないことを処理するようにDeserialize を実行します。また、var の使用を乱用しません。

于 2013-02-20T23:58:38.997 に答える