2016-04-18 2 views
-2

однако попробовать можно способом пытался, я не знаю, как я могу сериализовать (извините. Я нашел в английском словаре «Какой черт» это плохое слово? В любом случае я прошу прощения)Как я могу сериализовать этот класс

  1. Когда я использую BinaryFormatter, это выбросить исключение из RelayCommand (я хочу использовать XmlSerializer. Я должен увидеть текст файла)
    Я попытался с помощью [XmlIgnore], но я думаю, что кажется, что не применяются.
  2. Когда я использую XmlSerializer, я не знаю, где выполняется исключение throw.
  3. DataContractSerializer бросает много исключения. поэтому я не хочу использовать.

, пожалуйста, помогите мне. Пожалуйста, поймите, я не могу хорошо говорить по-английски.

это мой класс.

Удлинительное решение.
Решилось от основного решения.

[Serializable] 
public class SerializableContextBase : INotifyPropertyChanged 
{ 
    [field: NonSerialized()] 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void RaisePropertyChanged(string prop) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(prop)); 
     } 
    } 
} 

Главная Решение
Главная верхнего уровня Класс

[Serializable] 
public class ResultContext : SerializableContextBase 
{ 
    public ResultContext() { } 
private PerformanceContextCollection _PerformanceCollection = new PerformanceContextCollection(); 
    public PerformanceContextCollection PerformanceCollection 
    { 
     get { return _PerformanceCollection; } 
     set 
     { 
      if (_PerformanceCollection == value) { return; } 
      _PerformanceCollection = value; 
      RaisePropertyChanged("PerformanceCollection"); 
     } 
    } 

Класс Bottom Уровень

[Serializable] 
public class PerformanceContextCollection : ObservableCollection<PerformanceContext> 
{ 
    // some method 
    // public void Add(string Name){} ~~~ 
} 

[Serializable] 
public class PerformanceContext : SerializableContextBase 
{ 
    [XmlIgnore] 
    public RelayCommand<PerformanceContext> RemoveCommand { get; set; } 
    some string, some guid...~~ 
} 

ответ

0

Ваши классы разработаны как ViewModels, поэтому у них есть много дополнительного багажа что связано с их взаимодействием с WPF. Чтобы отправить информацию на другой уровень, обычную причину, по которой люди сериализуют данные, вы обычно используете другой класс - объект передачи данных. Я знаю, что это звучит педантично, но это решение также освобождает вас от использования той же структуры при сериализации. Например, вы можете сериализовать некоторые данные в виде списка, разделенного запятыми, вместо целого списка элементов, вы можете игнорировать свойства, которые в ViewModel используются для удобства взаимодействия с движком WPF, например, с использованием свойства Видимость или вместе с булевым IsVisible.

Если вы все еще хотите сериализовать свои классы, поскольку они ни в коем случае, самым простым способом (по крайней мере для меня) было бы реализовать IXmlSerializable и, таким образом, самостоятельно управлять выводом сериализации. Поймите, что, хотя сериализация по умолчанию работает хорошо и обычно не требует большой работы для разработчиков, она также обычно выводит ужасно подробный и трудный для чтения вывод XML. Например, большинство примитивных свойств выглядят лучше как атрибуты элемента, но сериализация создает дочерние элементы для каждого.

Смежные вопросы