C#无法序列化对象,因为MainViewModel未标记为Serializable

时间:2015-07-09 13:39:14

标签: c# wpf serialization mvvm

我刚开始玩二进制序列化。

我有一个班级" 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必须可序列化吗?我不明白。

感谢。

2 个答案:

答案 0 :(得分:1)

我最近在尝试序列化大型数据集时遇到了这个问题。

问题在于,某些模型或其他模型最终会出现与您正在使用的视图模型\命令\转换器中的某个元素的链接,因此序列化程序认为需要序列化整个视图模型。

如果您将主视图模型标记为Serializable,它将开始浏览连接到主视图模型的所有其他视图模型和命令,并为您提供相同的问题。

你需要找出连接的内容和位置,然后阻止它发生。

答案 1 :(得分:0)

这是因为您要序列化的内容引用了MainViewModel。怎么,我不知道。但我确实知道这不是魔法。

如果您序列化 X 的实例,但由于类型 Y 不可序列化而失败,那么 X的实例包含对 X 的引用类型为Y的实例。这是100%肯定的。

通常,您应该进行调试,然后在序列化之前从上到下检查对象图。对于二进制序列化,这包括事件,因为二进制序列化也将序列化事件侦听器。

二进制序列化是如此1.0。您应该了解序列化技术的最新发展。 NetDataContractSerializer和xaml序列化非常适合您的大多数.NET需求。当你的类型不重要时,Json很适合。 这些都不会序列化事件侦听器。