[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.
Подскажите пожалуйста, в чем может быть проблема.
Здравствуйте, bc_rich, Вы писали:
_>как можно заметить, FlowDocument сериализуется через костыль фактически, но другого способа я не знаю. _>Собственно проблема в том,что после десериализации пропадают изображения из FlowDocument, текст, таблицы, все остается как и было, а на месте изображений остается как бы пустое место. Не могу понять в чем проблема, т.к. данный метод работал в одном проекте, но там blob закидывался в базу SQLite. _>Не знаю, играет ли это какую-то роль, но FlowDocument импортрируются из RTF. _>Подскажите пожалуйста, в чем может быть проблема.
Скорее всего сохраняется (сериализуется) не контент картинки, а ее Uri.
Re[2]: [WPF] проблема с десериализацией FLowDocument
Здравствуйте, MxMsk, Вы писали:
MM>Скорее всего сохраняется (сериализуется) не контент картинки, а ее Uri.
Я конечно досконально не проверял, но дело вот в чем. Я импортирую из rtf файла некий документ, он добавляется в список в программе и становится самостоятельным FlowDocument'ом, т.е. я его в списке выбираю, он отображается в элементе UI и все у него на месте. Потом же этот список сохряняется на жесткий сериализацией. А при запуске программы обратно десириализуется. Так вот, что я проверил сразу, что до сериализации, и после десериализации количество байт в FlowDocument'е одинаковое, т.е. при сериализации вроде как ничего не теряется. И опять же мистика в том, что в ранней версии программы FlowDocumentы сохранялись на диск в виде файлов (ну фактически тем же методом, только вместо MemoryStream использовался просто Stream) и никаких проблем с изображениями не было. Может быть какой-то контекст теряется? Иных версий нет
Re[3]: [WPF] проблема с десериализацией FLowDocument
Здравствуйте, bc_rich, Вы писали:
_>Я конечно досконально не проверял, но дело вот в чем. Я импортирую из rtf файла некий документ, он добавляется в список в программе и становится самостоятельным FlowDocument'ом, т.е. я его в списке выбираю, он отображается в элементе UI и все у него на месте. Потом же этот список сохряняется на жесткий сериализацией. А при запуске программы обратно десириализуется. Так вот, что я проверил сразу, что до сериализации, и после десериализации количество байт в FlowDocument'е одинаковое, т.е. при сериализации вроде как ничего не теряется. И опять же мистика в том, что в ранней версии программы FlowDocumentы сохранялись на диск в виде файлов (ну фактически тем же методом, только вместо MemoryStream использовался просто Stream) и никаких проблем с изображениями не было. Может быть какой-то контекст теряется? Иных версий нет
Выкладывай пример для воспроизведения ситуации. Посмотрим.
И, кстати, просто Stream никак не мог быть использован, т.к. это абстрактный класс.
И снова здравствуйте. Приношу свои извинения за то что пропал, и бросил эту тему.
В общем причина такого поведения так и осталась загадкой для меня, но я нашел способ сохранения 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[] сохранить, это уж личное дело каждого