1

这是示例代码......但我得到了serializationException。

xlbook 是对象,我想将此对象保存到 memorystream。

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 回答