Как сериализовать класс со свойством TextRange?

Я пытаюсь сериализовать класс, в котором есть свойство типа TextRange.

Пример:

public class MyClass
{
    private string someProp;
    public string SomeProp
    {
        get { return someProp; }
        set { someProp = value; }
    }

    private TextRange myTextRange;
    public TextRange MyTextRange
    {
        get { return myTextRange; }
        set { myTextRange = value; }
    }
}

Дело в том, что тип TextRange не может быть сериализован регулярно при сериализации всего класса, у него есть собственный специальный метод для сериализации самого себя, я делаю это так:

using (MemoryStream ms = new MemoryStream())
{
    myTextRange.Save(ms, DataFormats.Xaml, true);
    string xaml = Encoding.ASCII.GetString(ms.ToArray());
}

Проблема в том, что я хочу, чтобы класс был сериализован в одну строку (строка xml) со свойством TextRange и другим свойством вместе. Я не против использования другого метода сериализации (не xml), но не понимаю, как он решает проблему.

Обычно я сериализую сразу весь класс, но класс TextRange не помечен как сериализуемый (без двоичной сериализации) и не имеет пустого конструктора (без сериализации xml).

Вот как я это делаю регулярно:

XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
StringWriter stringWriter = new StringWriter();
using (XmlWriter writer = XmlWriter.Create(stringWriter))
{
    serializer.Serialize(writer, this);
    string xml = stringWriter.ToString();
    return xml;
}

Как я могу это сделать?


person moonlander    schedule 11.11.2016    source источник
comment
что вам нужно от объекта TextRange?   -  person Headhunter Xamd    schedule 11.11.2016
comment
Я удалил тег из заголовка вашего вопроса. См. здесь почему.   -  person dymanoid    schedule 11.11.2016
comment
@HeadhunterXamd текст из RichTextBox с форматированием.   -  person moonlander    schedule 11.11.2016
comment
@moonlander вы имеете в виду полное текстовое поле или выделенный текст? Если вам нужен выделенный текст, это свойство Text экземпляра TextRange. Это просто строка, поэтому вы можете легко построить что-нибудь для нее. msdn.microsoft .com / ru-ru / library /   -  person Headhunter Xamd    schedule 11.11.2016
comment
@HeadhunterXamd мне нужен весь текст внутри RichTextBox, включая его форматирование (цвет, размер и т. Д.).   -  person moonlander    schedule 11.11.2016
comment
тогда вы можете игнорировать TextRange, не так ли? в таком случае просто добавьте атрибут [NonSerialized] в поле TextRange.   -  person Headhunter Xamd    schedule 11.11.2016
comment
но я хочу, чтобы этот TextRange был сериализован. он содержит весь текст, который находится в RichTextBox, включая форматирование текста. Проблема в том, что я не могу понять, как сериализовать свойства TextRange и Text моего класса в один и тот же блок xml.   -  person moonlander    schedule 11.11.2016
comment
Я имел в виду как свойство TextRange, так и строковое свойство SomeProp.   -  person moonlander    schedule 11.11.2016


Ответы (1)


Что ж, кому интересно. Проблема заключалась в том, что я хотел, чтобы весь объект MyClass был сериализован в одну строку xml. Но TextRange требует особого метода сериализации, как я писал в основном посте. Итак, обходной путь был:

  • Создайте общедоступный вспомогательный класс внутри MyClass, например MyClassSerializationHelper.

  • Добавьте к нему два строковых свойства, как и свойства MyClass, но как строки. В моем случае SomeProp и MyTextRange. Полные свойства (геттеры и сеттеры).

Для сериализации:

  • Создайте экземпляр MyClassSerializationHelper.

  • SomeProp получает то же значение из свойства MyClass SomeProp, потому что это строка.

  • MyTextRange получает сериализованную строку свойства MyClass MyTextRange с помощью специального метода сериализации.

  • Сериализуйте весь экземпляр MyClassSerializationHelper, вы получили строку xml.

Для десериализации:

  • Десериализуйте строку xml и получите instace MyClassSerializationHelper.

  • Десериализуйте свойство MyTextRange (это строка xml), чтобы получить экземпляр TextRange.

  • Перестройте экземпляр MyClass, используя десериализованные свойства.

Надеюсь, это ясно.

person moonlander    schedule 11.11.2016