Как сериализовать объекты com или excel в двоичный формат, чтобы я мог сохранить его в памяти в asp.net - PullRequest
1 голос
/ 25 января 2012

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

1 Ответ

5 голосов
/ 25 января 2012

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

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

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

...