C# 仅当对象的成员被数据绑定时序列化才会失败?

C# 仅当对象的成员被数据绑定时序列化才会失败?,c#,wpf,xaml,serialization,data-binding,C#,Wpf,Xaml,Serialization,Data Binding,我对C#和WPF很陌生,所以我可能忽略了一些东西 我有一个相当简单的类结构,如下所示: [Serializable] class ModuleList { public ObservableCollection<Module> Items { get; set; } public ModuleList() { Items = new ObservableCollection<Module>

我对C#和WPF很陌生,所以我可能忽略了一些东西

我有一个相当简单的类结构,如下所示:

[Serializable]
class ModuleList
{
    public ObservableCollection<Module> Items
    {
       get;
       set;
    }

    public ModuleList()
    { 
       Items = new ObservableCollection<Module>();
    }
}

[Serializable]
class Module : INotifyPropertyChanged
{
   private string name;
   public string Name
   {
      get
      {
         return this.name;
      }
      set
      {
         if(this.name != value)
         {
            this.name = value;
            this.NotifyPropertyChanged("Name");
         }
      }
   }
   public event PropertyChangedEventHandler PropertyChanged;

   public void NotifyPropertyChanged(string propName)
   {
      if(this.PropertyChanged != null)
      {
         this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
      }
   }
}

[Serializable]
class SpecializedModule : Module
{
   public SpecializedModule()
   {
      mode = false;
   }

   private bool mode;
   public bool Mode
   {
      get
      {
         return this.mode;
      }
      set
      {
         if(this.mode != value)
         {
            this.mode = value;
            this.NotifyPropertyChanged("Mode");
         }
      }
   }
}

一旦用户单击任何“选定”模块,加载即发生,网格的数据上下文设置为列表的相应项:

loadGrid("Module.xaml"); // XamlReader.Load in there
int idx = modListSel.getItemIndex("name_of_module");
if (idx != -1)
{
   grdModCfg.DataContext = (modListSel.Items[idx]); // this is a "SpecializedModule" object
}
现在问题来了。一旦任何具有此类数据绑定的模块加载到UI中,序列化就会失败。从xaml文件中删除数据绑定将使对象再次可序列化。当xaml是UI的一部分而不是动态加载时,序列化甚至可以与数据绑定一起工作

你知道为什么会这样吗?我该如何着手解决

编辑:

“fails”是指程序只是在
BinaryFormatter.Serialize()函数中中止执行。在try/catch块的包围下,我现在可以看到抛出了
System.Runtime.Serialization.SerializationException

扩展消息是:“WindowsBase,版本=4.0.0.0,区域性=中性,PublicKeyToken=31bf3856ad364e35”程序集中的“System.ComponentModel.PropertyChangedEventManager”类型未标记为可序列化


我在上面的模块类列表中添加了
NotifyPropertyChanged
的定义,看起来我在剪切不重要的部分时忘记了这么做,很抱歉。

define“fails”;发生了什么?在
模块
类中显示
属性更改
事件的声明。我怀疑你没有用
[field:NonSerialized]
属性来修饰它。不确定这是否完全是相同的情况,但我在用JSON序列化绑定数据时遇到了类似的问题。WPF和序列化都要求数据与处理数据的线程具有亲缘关系(我想是为了维护线程安全)。我通过使任何连接到依赖项对象的东西都可自由化来修复它,然后显式地让序列化/反序列化在单独的线程上下文中完成。@IvanStoev:你说得对,添加它可以修复问题。在我开始动态加载xaml之前,我不知道它为什么会工作,或者更确切地说,在没有数据绑定的情况下序列化对象时,它不应该引发异常吗?这取决于数据绑定基础结构在尝试序列化时是否订阅了
PropertyChanged
事件。当存在订阅服务器时,问题就会出现,在这种情况下,二进制序列化程序(不带该属性)将尝试序列化订阅的对象及其引用的所有对象等。定义“失败”;发生了什么?在
模块
类中显示
属性更改
事件的声明。我怀疑你没有用
[field:NonSerialized]
属性来修饰它。不确定这是否完全是相同的情况,但我在用JSON序列化绑定数据时遇到了类似的问题。WPF和序列化都要求数据与处理数据的线程具有亲缘关系(我想是为了维护线程安全)。我通过使任何连接到依赖项对象的东西都可自由化来修复它,然后显式地让序列化/反序列化在单独的线程上下文中完成。@IvanStoev:你说得对,添加它可以修复问题。在我开始动态加载xaml之前,我不知道它为什么会工作,或者更确切地说,在没有数据绑定的情况下序列化对象时,它不应该引发异常吗?这取决于数据绑定基础结构在尝试序列化时是否订阅了
PropertyChanged
事件。当存在订阅服务器时,问题就会出现,在这种情况下,二进制序列化程序(不带该属性)将尝试序列化订阅的对象及其引用的所有对象等。
loadGrid("Module.xaml"); // XamlReader.Load in there
int idx = modListSel.getItemIndex("name_of_module");
if (idx != -1)
{
   grdModCfg.DataContext = (modListSel.Items[idx]); // this is a "SpecializedModule" object
}