1

これがサンプルコードです...しかし、私はserializationExceptionを取得しています。

xlbookはオブジェクトであり、このオブジェクトをメモリストリームに保存したいと思います。

unsafe public void Save(IStream stream, bool clearDirty, Excel.Workbook xlbook)
{
    try
    {
        //if (stream == null)
        //{
        //    return;
        //}
        //object data = xlbook;
        if (xlbook == null)
        {
            return;
        }
        // convert data to byteArray   


        MemoryStream memoryStream = new MemoryStream();
        BinaryFormatter binaryFormatter = new BinaryFormatter();
        //AppDomain currentDomain = AppDomain.CurrentDomain;                        
        //currentDomain.AssemblyResolve += new ResolveEventHandler(currentDomain_AssemblyResolve); 


  //here im getting exception.                        
        binaryFormatter.Serialize(memoryStream, xlbook);            
        byte[] bytes = memoryStream.ToArray();
        memoryStream.Close();
        //get memory pointer
        int cb;
        int* pcb = &cb;
        //save data
        byte[] arrayLen = BitConverter.GetBytes(bytes.Length);
        stream.Write(arrayLen, arrayLen.Length, new IntPtr(pcb));
        stream.Write(bytes, bytes.Length, new IntPtr(pcb));
        //currentDomain.AssemblyResolve -= new ResolveEventHandler(currentDomain_AssemblyResolve);
    }
    catch
    {

    }
}

私が得ている例外は...

アセンブリ'Microsoft.Office.Interop.Excel、Version = 11.0.0.0、Culture = neutral、PublicKeyToken =71e9bce111e9429c'に'Microsoft.Office.Interop.Excel.WorkbookClass'と入力すると、シリアル化可能としてマークされません。

4

1 に答える 1

5

.Net シリアライザーが機能するには、シリアライズするオブジェクトの型がシリアライズ可能とマークされている必要があります。この場合、WorkbookClass はそのようにマークされていません。WorkbookClass のラッパーを作成して ISerializable を実装するか、フォーマッタ/フォーマット サロゲートを作成して作業を行うことで、おそらくこれを回避できます。しかし、あなたが取った解決策は必ず失敗します。

なんで?まず、COM オブジェクトの内部構造は不明であり、インターフェイスだけです。それらはほとんど管理されていません。.Net は、その上に適切なラッパーを配置するだけです。そのため、単純にすべてのバイトをストリームに書き込む場合は、アンマネージ ポインターをシリアル化する可​​能性があります (読み取り: します)。それらを再びデシリアライズするとき、それらは何も指さないか、何か間違っていることを示しません。また、それらは管理されていないため、それらがポインター (データではない) であることも、何を指しているのかを理解する方法もありません。(または、非常に深く掘り下げて、実行時にそのバイナリ形式を把握する必要があります。) また、オフィスの COM オブジェクトについて私が覚えていることから、それらはほとんどの場合、独自のオフィス プロセスを生成し、それと通信するため、終了することさえあります。プロセスへのハンドルをシリアル化します。全体として、必ず失敗します。

おそらく WorkbookClass (またはその親/コンテナー) には .Save() のようなメソッドがあり、それを使用して、データを保存した場所に FileStream を使用する必要があります。

于 2012-01-25T07:34:32.343 に答える