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"未标记为可序列化.
要使.Net序列化程序起作用,它要序列化的对象必须具有标记为可序列化的类型.在这种情况下,WorkbookClass没有标记为这样.您可以通过为WorkbookClass创建一个包装器并实现ISerializable来解决这个问题,或者您可以使格式化程序/格式化为您完成工作.但是你采取的任何解决方案都必然会失败.
为什么?首先,COM对象的内部结构是未知的,只有它的接口.他们大多没有管理..Net只是在它上面放了一个漂亮的包装器.因此,当简单地将其所有字节写入流时,您可能(读取:将)序列化非托管指针.当再次反序列化它们时,它们不会指向任何东西,或者指向错误的东西.由于它们是不受管理的,因此无法确定它们是指针(而不是数据),也不是它们指向的内容.(或者你必须深入挖掘并在运行时找出它的二进制格式.)另外,从我记得的办公室COM对象,他们将主要产生自己的办公过程,并与之沟通,所以你甚至可以结束序列化进程的句柄.总而言之,一定会失败.
可能WorkbookClass(或它的父/容器)有类似.Save()的方法,你应该使用它并使用FileStream来保存数据.