【发布时间】:2015-07-09 13:39:14
【问题描述】:
我刚开始玩一点二进制序列化。
我有一个要序列化的类“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 中,我有一个“SerializeBase”类型的 ObservableCollection 和一个序列化集合中第一项的方法:
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 标记为可序列化,所有这些都有效。
这行得通:
namespace Namespace
{
[Serializable]
public class MainViewModel : ViewModelBase
.
.
.
这不是:
namespace Namespace
{
public class MainViewModel : ViewModelBase
.
.
.
错误详情:MainViewModel... 类型未标记为可序列化。
有人可以解释为什么我的 MainViewModel 必须是可序列化的吗?没看懂。
谢谢。
【问题讨论】:
-
父类是可序列化的并不意味着子类是可序列化的。您必须明确告诉它它可以被序列化,否则它假定它不能。至少
[Serializable]属性是这样工作的。如果你在基类上实现了ISerializable,那么我认为它可以工作。 -
感谢您的回答,但是:我不想序列化我的 MainViewModel。只有 _workspaces 集合中的第一项
-
您可能想澄清您的问题,因为
Workspaces不包含MainViewModel引用并不明显,因为它派生自一个公共基类,它似乎肯定可以。跨度> -
完全题外话——为什么要序列化视图模型?
-
不确定我是否理解您的评论。工作区不能引用 MainViewModel,MainViewModel 派生自 ViewModelBase 而不是 SerializeBase
标签: c# wpf serialization mvvm