2016-11-11 3 views
1

Я пытаюсь сериализовать класс, который имеет свойство типа 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 не помечен как сериализуемый (без двоичной серилизации) и не имеет пустого конструктора (без хемилирования).

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

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; 
} 

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

+0

Что вам нужно от объекта TextRange? –

+0

Я удалил тег из названия вопроса. См. [Здесь] (http://stackoverflow.com/help/tagging) почему. – dymanoid

+0

@HeadhunterXamd текст из RichTextBox с форматированием. – moonlander

ответ

0

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

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

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

сериализовать:

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

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

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

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

десериализовать:

  • Deserialize строку XML и получить MyClassSerializationHelper instace.

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

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

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