所以,我正在使用以下程序集,它具有以下定义(相当无害):
public class QueryDefinition
{
private List<QueryFilter> TheCurrentFilters = null;
public List<QueryFilter> CurrentFilters
{
set { TheCurrentFilters = value; }
get { return TheCurrentFilters; }
}
// other code
public class QueryFilter
{
// member variables are: seven public string's & two public int's
public override string ToString()
{
return FilterText;
}
}
}
在另一个程序集中,我们有一个UserControl:
public partial class QueryWizard : UserControl
{
private List<QueryDefinition.QueryFilter> TheCurrentFilters = null;
public List<QueryDefinition.QueryFilter> CurrentFilters
{
set { TheCurrentFilters = value; }
get { return TheCurrentFilters; }
}
// other code
}
有趣的代码,但这就是我必须使用的代码。
无论如何,如果我转到另一个项目(引用此UserControl),创建一个Form,然后将控件放到Form上,我收到此错误:
'System.Runtime.Serialization.SerializationException:在Assembly ...中键入QueryDefinition + QueryFilter'未标记为可序列化。'
我实际上并没有使用任何序列化代码,所以这个QueryFilter列表是什么导致SerializationException?
我使用[Serializable]标签来摆脱这个问题。但最近我们正在重建项目(Visual WebGUI升级),现在我遇到了“无法加载反序列化所需的类型”问题。我决定尝试找出为什么我们首先需要序列化标签,而不是解决这个问题!感谢。
答案 0 :(得分:2)
这是因为设计人员试图将usercontrols“CurrentFilters”属性的内容序列化为表单初始化代码。
检查DesignerSerializationVisibility属性:http://msdn.microsoft.com/en-us/library/system.componentmodel.designerserializationvisibility.aspx
如果您不打算支持CurrentFilters属性的设计时编辑,将其设置为隐藏应该可以解决问题(我想,自从我构建winforms控件以来已经很久了)
答案 1 :(得分:2)
CurrentFilters的实际值使用BinaryFormatter进行序列化并存储在.resx文件中。你几乎肯定不希望这种情况发生。首先,您将依赖于包含QueryFilter类的程序集的[AssemblyVersion]编号。这应该解释你现在得到的“无法加载类型”异常。
首先了解CurrentFilters如何在设计时结束值。您需要注意在设计时运行的事件。典型的候选者是构造函数和Load事件。使用Control.DesignTime属性来阻止代码运行。
接下来,确保通过应用属性来保持属性值:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public List<QueryFilter> CurrentFilters
{
}