gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:28:27 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

关于c# - 如何将 com 或 excel 对象序列化为二进制格式,以便我可以将其存储在 asp.net 的内存流中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8999004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com