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

Вот пример кода ... но я получаю исключение 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, Version = 11.0.0.0, Culture = нейтральный, PublicKeyToken = 71e9bce111e9429c» не помечен как сериализуемый.


person ani    schedule 25.01.2012    source источник
comment
если вы хотите добавить информацию к вопросу, вам следует отредактировать исходный вопрос, а не задавать новый вопрос.   -  person phoog    schedule 25.01.2012
comment
@ani, глядя на другие вопросы, которые вы задавали по stackoverflow, есть несколько моментов, которые должны быть вам понятны: 1) Не используйте офисный COM в asp.net. 2) если вы упорствуете, вы не сможете избежать использования временного файла. 3) подумайте о том, чтобы сделать это с помощью xml + xslt, чтобы получить файлы xlsx, это вы можете сделать без временного файла. 4) нет, вы действительно не можете сериализовать COM-объекты, и даже если бы вы это сделали, это никогда не будет действительным файлом .xls (x).   -  person Captain Coder    schedule 25.01.2012
comment
Я должен повторить то, что сказал @CaptainCoder: не используйте автоматизацию Office в ASP.NET или любом другом серверном приложении. Он не предназначен для этого, он не будет работать должным образом, он будет ломаться, что будет трудно диагностировать, он не поддерживается и может даже нарушить ваше лицензионное соглашение с Microsoft, если у всех, кто использует эту функцию веб-сайта, также есть Office собственная лицензия. Просто не делай этого   -  person John Saunders    schedule 25.01.2012


Ответы (1)


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

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

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

person Captain Coder    schedule 25.01.2012