2015-07-09 3 views
0

Я только немного начал играть с Binary Serialization.C# Невозможно сериализовать объект, потому что MainViewModel не отмечен Сериализуемый

У меня есть класс "SerializeMe", который я хочу сериализации:

[Serializable] 
public class ViewModelBase : INotifyPropertyChanged 
{ 
    [field: NonSerialized] 
    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void RaisePropertyChanged(
         [CallerMemberName]string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

[Serializable] 
public class SerializeBase : ViewModelBase 
{ 
    . 
    . 
    . 
} 

класса я хочу сериализации:

[Serializable] 
public class SerializeMe : SerializeBase 
{ 
    . 
    . 
    . 
} 

В моей MainViewModel я есть ObservableCollection типа "SerializeBase" и a Метод, который сериализует первый элемент в коллекции:

public class MainViewModel : ViewModelBase 
{ 
    private ObservableCollection<SerializeBase> _workspaces; 

    public MainViewModel() 
    { 
     _workspaces = new ObservableCollection<SerializeBase> 
    // EDIT 
        { 
         new SerializeMe(), 
         new SerializeMe() 
        } 
    // EDIT END 
    } 

    public ObservableCollection<SerializeBase> Workspaces 
    { 
     get { return _workspaces; } 
     set 
     { 
       if (value == _workspaces) 
        return; 

       _workspaces = value; 
       RaisePropertyChanged(); 
     } 
    } 

    public void SerializeFirst() 
    { 
     var fisrtItem = _workspaces.FirstOrDefault(); 
     if (firstItem == null) 
      return; 

     using(var stream = new FileStream("file.bin", FileMode.Create)) 
     { 
      new BinaryFormatter().Serialize(stream, firstItem); 
     } 
    } 
} 

Все это работает, только если я отмечаю мой MainViewModel как Serializable.

Это работает:

namespace Namespace 
{ 
    [Serializable] 
    public class MainViewModel : ViewModelBase 
    . 
    . 
    . 

Это не так: детали

namespace Namespace 
{ 
    public class MainViewModel : ViewModelBase 
    . 
    . 
    . 

Ошибка: Тип MainViewModel ... не помечен как Serializable.

Может ли кто-нибудь объяснить, почему мой MainViewModel должен быть сериализуемым? Я не понимаю.

Спасибо.

+0

Просто потому, что родительские классы сериализуемы, не означает, что это классы-потомки. Вы должны прямо сказать, что он может быть сериализован, иначе он предполагает, что он не может. По крайней мере, как работает атрибут '[Serializable]'. Если вы использовали 'ISerializable' в базовом классе, то я думаю, что это работает. –

+0

Спасибо за ответ, но: Я НЕ хочу сериализовать мой MainViewModel. Только первый элемент в _workspaces Collection –

+0

Возможно, вы захотите уточнить свой вопрос, потому что его неясно, что 'Workspaces' не будет содержать ссылку« MainViewModel », поскольку она проистекает из общего базового класса, кажется, что это конечно. –

ответ

0

Это потому, что то, что вы хотите сериализовать, имеет ссылку на MainViewModel. Как, я не знаю. Но я знаю, что это не волшебство.

если вы сериализовать экземпляр X, и он терпит неудачу, потому что тип Y не сериализации, то что экземпляр X содержит ссылку на экземпляр типа Y. Это 100% уверен.

Обычно вы должны отлаживать, и прямо перед сериализацией вы проверяете этот граф объектов сверху вниз. Для двоичной сериализации это включает события, поскольку двоичная сериализация также сериализует прослушиватели событий.

Двоичная сериализация - 1.0. Вы должны изучить последние разработки в области технологий сериализации. Сериализация NetDataContractSerializer и xaml хорошо подходят для большинства ваших потребностей .NET. Json отлично подходит, когда ваши типы не так важны. Ни один из них не будет сериализовать прослушиватели событий.

1

У меня была эта точная проблема в последнее время при попытке сериализации большого набора данных.

Проблема в том, что какая-то из ваших моделей закончила с ссылкой на какой-либо элемент из модели view \ commands \ converters, которую вы используете, и поэтому сериализатор считает, что ему необходимо сериализовать всю модель представления ,

Если вы отметите модель основного вида как Serializable, она начнет просматривать все другие модели и команды просмотра, подключенные к вашей основной модели представления, и даст вам такую ​​же проблему с ними.

Вам нужно узнать, что происходит с подключением и где, а затем остановить его.

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