Библиотека .Net C# DocX: как сериализовать документ DocX?

При использовании библиотеки DocX я создаю документ docx на сервере, а затем загружаю его.

Для этого мне нужно преобразовать мой документ в массив байтов.

Для этого я ранее сохранял документ в виде физического файла следующим образом:

// Save all changes to this document.
document.SaveAs(GENERATED_DOCX_LOCATION);

return System.IO.File.ReadAllBytes(GENERATED_DOCX_LOCATION);

но я бы предпочел этого не делать. Можно ли сериализовать этот объект, чтобы загрузить его без физического сохранения?

Я уже пробовал это:

private byte[] ObjectToByteArray(object obj)
{
    if (obj == null)
        return null;
    BinaryFormatter bf = new BinaryFormatter();
    using (MemoryStream ms = new MemoryStream())
    {
        bf.Serialize(ms, obj);
        return ms.ToArray();
    }
}

С :

return this.ObjectToByteArray(document);

Но очевидно, что DocX не реализует ISerializable.

ИЗМЕНИТЬ: приведенный ниже код также не работает

byte[] byteArray = null;
using (var stream = new MemoryStream())
{
    document.SaveAs(stream);
    byteArray = stream.ToArray();
}
return byteArray;

person G.Dealmeida    schedule 02.10.2017    source источник
comment
это веб-сервер и внутренний для вашей организации?   -  person Simon Price    schedule 02.10.2017
comment
да, это частный сервер, управляемый специальной командой   -  person G.Dealmeida    schedule 02.10.2017
comment
Тогда взгляните на это, и это должно дать вам то, что вам нужно (если вы не используете MVC, что будет другим ответом, но я могу написать его для вас позже, если вам нужно), но... это должно работать stackoverflow.com/questions/18477398/   -  person Simon Price    schedule 02.10.2017
comment
На самом деле это не HTTP-сервер. Извините, я должен был быть более явным. Это служба Windows (приложение WCF), которая использует двоичный канал для передачи данных. Поэтому я не думаю, что ваша ссылка может быть здесь применима (но я оставлю ее в избранном, потому что через пару месяцев мы планируем перейти на SOAP)   -  person G.Dealmeida    schedule 02.10.2017
comment
хорошо, позвольте мне попробовать кое-что со своей стороны, и я вернусь к вам   -  person Simon Price    schedule 02.10.2017
comment
следующий вопрос, который у меня есть, вы можете получить файл в массив байтов?   -  person Simon Price    schedule 02.10.2017
comment
Да, первый образец кода, который я опубликовал, делает именно это. GENERATED_DOCX_LOCATION — частная строка только для чтения, содержащая место для записи документа.   -  person G.Dealmeida    schedule 02.10.2017


Ответы (2)


Попробуйте это, замените мой путь c:\temp... на местоположение вашего документа, и это получит и запишет файл для вас из массива байтов.

void Main()
{
    byte[] bytes = System.IO.File.ReadAllBytes(@"C:\temp\test.csv");

    using (var bw = new BinaryWriter(File.Open(@"C:\temp\test2.csv", FileMode.OpenOrCreate)))
    {
        bw.Write(bytes);
        bw.Flush();
    }

}
person Simon Price    schedule 02.10.2017
comment
Спасибо за внимание, но я не хочу сохранять файл test2.csv на диск. я нашел способ выйти из этого, изменив библиотеку DocX, см. мой пост для более подробной информации. Спасибо - person G.Dealmeida; 03.10.2017
comment
это был просто пример того, как вы можете делать то, что вам нужно, вам не нужно сохранять файл csv - person Simon Price; 03.10.2017
comment
Это не то, что мне нужно делать, потому что вы начинаете с байта [] из физического файла, а у меня есть DocX для начала в памяти, а не на диске. - person G.Dealmeida; 03.10.2017

Не было возможности сделать это через оригинальную библиотеку DocX.

Это позор, так как эта библиотека использует MemoryStream для управления данными.

Чтобы решить мою проблему, я просто добавил новое общедоступное свойство только для чтения, чтобы открыть частную переменную MemoryStream, затем я использовал этот простой код:

Код добавлен в проект DocX:

public MemoryStream DocumentMemoryStream { get { return this.memoryStream; }  } 

Код в моей основной функции:

return document.DocumentMemoryStream.ToArray();
person G.Dealmeida    schedule 03.10.2017