如何将com或excel对象序列化为二进制格式,以便我可以将它存储在asp.net的内存流中

ani*_*ani 1 c# asp.net assemblies memorystream object-serialization

这是示例代码...但我得到了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
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的例外是......

在程序集"Microsoft.Office.Interop.Excel,Version = 11.0.0.0,Culture = neutral,PublicKeyToken = 71e9bce111e9429c"中键入"Microsoft.Office.Interop.Excel.WorkbookClass"未标记为可序列化.

Cap*_*der 5

要使.Net序列化程序起作用,它要序列化的对象必须具有标记为可序列化的类型.在这种情况下,WorkbookClass没有标记为这样.您可以通过为WorkbookClass创建一个包装器并实现ISerializable来解决这个问题,或者您可以使格式化程序/格式化为您完成工作.但是你采取的任何解决方案都必然会失败.

为什么?首先,COM对象的内部结构是未知的,只有它的接口.他们大多没有管理..Net只是在它上面放了一个漂亮的包装器.因此,当简单地将其所有字节写入流时,您可能(读取:将)序列化非托管指针.当再次反序列化它们时,它们不会指向任何东西,或者指向错误的东西.由于它们是不受管理的,因此无法确定它们是指针(而不是数据),也不是它们指向的内容.(或者你必须深入挖掘并在运行时找出它的二进制格式.)另外,从我记得的办公室COM对象,他们将主要产生自己的办公过程,并与之沟通,所以你甚至可以结束序列化进程的句柄.总而言之,一定会失败.

可能WorkbookClass(或它的父/容器)有类似.Save()的方法,你应该使用它并使用FileStream来保存数据.