2012-01-25 10 views
1

Вот пример кода ... но я получаю исключение serializationException.Как сериализовать объекты com или excel в двоичном формате, чтобы я мог хранить его в memystream в asp.net.

xlbook - это объект, и я хочу сохранить этот объект в memystream.

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.WorkbookClass' в Microsoft.Office.Interop.Excel Ассамблеи», Version = 11.0.0.0, Culture = нейтральный, PublicKeyToken = 71e9bce111e9429c 'не помечен как сериализуемый.

+0

Возможный дубликат [Microsoft.Office.Interop.Excel.WorkbookClass в сборке «Microsoft.Office.Interop.Excel не помечен как сериализуемый] (http://stackoverflow.com/questions/8998836/microsoft-office -interop-excel-workbookclass-in-assembly-microsoft-office-inte) – phoog

+0

Если вы хотите добавить информацию к вопросу, вы должны отредактировать исходный вопрос, а не задавать новый вопрос. – phoog

+2

@ani, глядя на другие вопросы, которые вы задали в stackoverflow, есть несколько моментов, которые должны быть вам понятны, 1) Не используйте office COM в asp.net. 2) если вы упорствуете, вы не можете избежать использования временного файла. 3) подумайте об этом с помощью xml + xslt, чтобы предоставить xlsx-файлы, которые вы можете сделать с помощью временного файла. 4) нет, вы действительно не можете serlialize COM-объекты, и даже если вы это сделаете, это никогда не будет действительным файлом .xls (x). –

ответ

5

Для того, чтобы сериализатор .Net работал, объекты, которые он должен сериализовать, должны иметь тип, обозначенный как сериализуемый. В этом случае WorkbookClass не помечен как таковой. Вероятно, вы можете получить это, сделав обертку для WorkbookClass и внедряя ISerializable, или вы можете сделать форматирование/форматирование surogates, чтобы выполнить эту работу за вас. Но любое решение, которое вы принимаете, обязательно потерпит неудачу.

Почему? Прежде всего, внутренняя структура COM-объектов неизвестна, только интерфейс. Они в основном неуправляемы. .Net просто накладывает на нее красивую обертку. Поэтому, когда вы просто записываете все свои байты в поток, вы можете (читать: будет) сериализовывать неуправляемые указатели. Когда они десериализуют их снова, они не будут указывать ни на что, или на что-то не так. И поскольку они неуправляемы, нет никакого способа понять, что они - указатели (а не данные), и то, на что они указывают. (Или вам придется очень глубоко копать и определять свой двоичный формат во время выполнения.) Также из того, что я помню о COM-объектах офиса, они в основном создадут свой собственный офисный процесс и общаются с ним, так что вы даже можете оказаться в конечном итоге сериализация дескриптора процесса. В общем, обречены на провал.

Возможно, WorkbookClass (или его родительский/контейнер) имеет метод .Save(), вы должны использовать его и использовать FileStream везде, где вы сохранили данные.