[WPF] проблема с десериализацией FLowDocument
От: bc_rich  
Дата: 11.05.11 09:42
Оценка:
Здравствуйте. Есть следующий класс:

[Serializable]
public class DatchPageClass : ISerializable
{

[NonSerialized]
public FlowDocument document;


public string Name { get; set; }
public string FileID { get; set; }
private byte[] blob;
public DatchPageClass(string name)
{
Name = name;
}

#region Члены ISerializable

protected DatchPageClass(SerializationInfo info, StreamingContext context)
{
Name = info.GetString("Name");
blob = (byte[])info.GetValue("Blob", typeof(byte[]));
MemoryStream stream = new MemoryStream(blob);
document = (FlowDocument) XamlReader.Load(stream);
stream.Dispose();
}

public void GetObjectData(SerializationInfo info, StreamingContext context)
{
MemoryStream stream = new MemoryStream();
XamlWriter.Save(document, stream);
blob = stream.ToArray();
info.AddValue("Name", Name);
info.AddValue("Blob", blob, typeof(byte[]));
}

#endregion
}


как можно заметить, FlowDocument сериализуется через костыль фактически, но другого способа я не знаю.
Собственно проблема в том,что после десериализации пропадают изображения из FlowDocument, текст, таблицы, все остается как и было, а на месте изображений остается как бы пустое место. Не могу понять в чем проблема, т.к. данный метод работал в одном проекте, но там blob закидывался в базу SQLite.
Не знаю, играет ли это какую-то роль, но FlowDocument импортрируются из RTF.
Подскажите пожалуйста, в чем может быть проблема.
wpf flowdocument
Re: [WPF] проблема с десериализацией FLowDocument
От: MxMsk Португалия  
Дата: 11.05.11 10:56
Оценка: +1
Здравствуйте, bc_rich, Вы писали:

_>как можно заметить, FlowDocument сериализуется через костыль фактически, но другого способа я не знаю.

_>Собственно проблема в том,что после десериализации пропадают изображения из FlowDocument, текст, таблицы, все остается как и было, а на месте изображений остается как бы пустое место. Не могу понять в чем проблема, т.к. данный метод работал в одном проекте, но там blob закидывался в базу SQLite.
_>Не знаю, играет ли это какую-то роль, но FlowDocument импортрируются из RTF.
_>Подскажите пожалуйста, в чем может быть проблема.
Скорее всего сохраняется (сериализуется) не контент картинки, а ее Uri.
Re[2]: [WPF] проблема с десериализацией FLowDocument
От: bc_rich  
Дата: 11.05.11 14:20
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM>Скорее всего сохраняется (сериализуется) не контент картинки, а ее Uri.


Я конечно досконально не проверял, но дело вот в чем. Я импортирую из rtf файла некий документ, он добавляется в список в программе и становится самостоятельным FlowDocument'ом, т.е. я его в списке выбираю, он отображается в элементе UI и все у него на месте. Потом же этот список сохряняется на жесткий сериализацией. А при запуске программы обратно десириализуется. Так вот, что я проверил сразу, что до сериализации, и после десериализации количество байт в FlowDocument'е одинаковое, т.е. при сериализации вроде как ничего не теряется. И опять же мистика в том, что в ранней версии программы FlowDocumentы сохранялись на диск в виде файлов (ну фактически тем же методом, только вместо MemoryStream использовался просто Stream) и никаких проблем с изображениями не было. Может быть какой-то контекст теряется? Иных версий нет
Re[3]: [WPF] проблема с десериализацией FLowDocument
От: MxMsk Португалия  
Дата: 12.05.11 06:06
Оценка:
Здравствуйте, bc_rich, Вы писали:

_>Я конечно досконально не проверял, но дело вот в чем. Я импортирую из rtf файла некий документ, он добавляется в список в программе и становится самостоятельным FlowDocument'ом, т.е. я его в списке выбираю, он отображается в элементе UI и все у него на месте. Потом же этот список сохряняется на жесткий сериализацией. А при запуске программы обратно десириализуется. Так вот, что я проверил сразу, что до сериализации, и после десериализации количество байт в FlowDocument'е одинаковое, т.е. при сериализации вроде как ничего не теряется. И опять же мистика в том, что в ранней версии программы FlowDocumentы сохранялись на диск в виде файлов (ну фактически тем же методом, только вместо MemoryStream использовался просто Stream) и никаких проблем с изображениями не было. Может быть какой-то контекст теряется? Иных версий нет

Выкладывай пример для воспроизведения ситуации. Посмотрим.
И, кстати, просто Stream никак не мог быть использован, т.к. это абстрактный класс.
Re: [WPF] проблема с десериализацией FLowDocument
От: bc_rich  
Дата: 30.06.11 09:46
Оценка:
И снова здравствуйте. Приношу свои извинения за то что пропал, и бросил эту тему.
В общем причина такого поведения так и осталась загадкой для меня, но я нашел способ сохранения FlowDocument в byte[] без потери изображений, собственно вот:
        public static byte[] FlowDocumennToBlob(FlowDocument document)
        {
            MemoryStream stream = new MemoryStream();
            TextRange tr = new TextRange(document.ContentStart, document.ContentEnd);
            tr.Save(stream, DataFormats.Rtf);
            byte[] blob = stream.ToArray();
            stream.Close();
            return blob;
        }

        public static FlowDocument BlobToFlowDocument(byte[] blob)
        {
            MemoryStream stream = new MemoryStream();
            FlowDocument document = new FlowDocument();
            TextRange tr = new TextRange(document.ContentStart, document.ContentEnd);
            if (!tr.CanLoad(DataFormats.Rtf)) return null;
            stream.Write(blob, 0, blob.Length);
            if (stream.Length != 0)
            tr.Load(stream, DataFormats.Rtf);
            stream.Close();
            return document;
        }

Ну а куда потом byte[] сохранить, это уж личное дело каждого
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.