我刚开始玩二进制序列化。
我有一个班级" 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"以及序列化集合中第一个项目的方法:
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 :(得分:1)
我最近在尝试序列化大型数据集时遇到了这个问题。
问题在于,某些模型或其他模型最终会出现与您正在使用的视图模型\命令\转换器中的某个元素的链接,因此序列化程序认为需要序列化整个视图模型。
如果您将主视图模型标记为Serializable,它将开始浏览连接到主视图模型的所有其他视图模型和命令,并为您提供相同的问题。
你需要找出连接的内容和位置,然后阻止它发生。
答案 1 :(得分:0)
这是因为您要序列化的内容引用了MainViewModel
。怎么,我不知道。但我确实知道这不是魔法。
如果您序列化 X 的实例,但由于类型 Y 不可序列化而失败,那么 X的实例包含对 X 的引用类型为Y的实例。这是100%肯定的。
通常,您应该进行调试,然后在序列化之前从上到下检查对象图。对于二进制序列化,这包括事件,因为二进制序列化也将序列化事件侦听器。
二进制序列化是如此1.0。您应该了解序列化技术的最新发展。 NetDataContractSerializer和xaml序列化非常适合您的大多数.NET需求。当你的类型不重要时,Json很适合。 这些都不会序列化事件侦听器。