为什么我甚至需要首先进行序列化?

时间:2010-05-05 15:47:05

标签: c# winforms serialization user-controls

所以,我正在使用以下程序集,它具有以下定义(相当无害):

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升级),现在我遇到了“无法加载反序列化所需的类型”问题。我决定尝试找出为什么我们首先需要序列化标签,而不是解决这个问题!感谢。

2 个答案:

答案 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
 {
 }