C# 仅当对象的成员被数据绑定时序列化才会失败?
我对C#和WPF很陌生,所以我可能忽略了一些东西 我有一个相当简单的类结构,如下所示: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>
[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
}