Я только немного начал играть с 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 должен быть сериализуемым? Я не понимаю.
Спасибо.
Просто потому, что родительские классы сериализуемы, не означает, что это классы-потомки. Вы должны прямо сказать, что он может быть сериализован, иначе он предполагает, что он не может. По крайней мере, как работает атрибут '[Serializable]'. Если вы использовали 'ISerializable' в базовом классе, то я думаю, что это работает. –
Спасибо за ответ, но: Я НЕ хочу сериализовать мой MainViewModel. Только первый элемент в _workspaces Collection –
Возможно, вы захотите уточнить свой вопрос, потому что его неясно, что 'Workspaces' не будет содержать ссылку« MainViewModel », поскольку она проистекает из общего базового класса, кажется, что это конечно. –