【问题标题】:How to serialize the com or excel objects to binary format so that i can store it in memorystream in asp.net如何将 com 或 excel 对象序列化为二进制格式,以便我可以将其存储在 asp.net 的 memorystream 中
【发布时间】:2012-01-25 07:10:25
【问题描述】:

这是示例代码...但我得到了 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”未标记为可序列化。

【问题讨论】:

  • 如果您想向问题添加信息,您应该编辑原始问题,而不是提出新问题。
  • @ani,看看你在stackoverflow上提出的其他问题,现在你应该清楚几点,1)不要在asp.net中使用office COM。 2)如果你坚持,你不能避免使用临时文件。 3) 考虑使用 xml+xslt 来提供 xlsx 文件,这可以在没有临时文件的情况下完成。 4) 不,你真的不能序列化 COM 对象,即使你愿意,这也永远不会是一个有效的 .xls(x) 文件。
  • 我必须重申 @CaptainCoder 所说的:不要在 ASP.NET 或任何其他服务器应用程序中使用 Office 自动化。它不是为它设计的,它不能正常工作,它会以难以诊断的方式中断,不受支持,甚至可能违反你与 Microsoft 的许可协议,除非每个使用该网站功能的人都拥有 Office自己的执照。 只是不要这样做

标签: c# asp.net assemblies memorystream object-serialization


【解决方案1】:

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

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

可能 WorkbookClass(或其父/容器)有一个类似 .Save() 的方法,您应该使用它并使用 FileStream 到您保存数据的任何位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多