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

3

所以,我正在处理以下程序集,其中定义了以下内容(相当无害):

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;
        }
    }
}

在另一个程序集中,我们有一个用户控件:

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: Type QueryDefinition+QueryFilter' in Assembly ... is not marked as serializable.'

实际上,我并没有使用任何序列化代码,那么这个QueryFilter列表中的哪个原因导致SerializationException?

为了解决这个问题,我已经使用了[Serializable]标记。但最近我们正在重建项目(Visual WebGUI升级),现在我遇到了“无法加载反序列化所需的类型”的问题。因此,我决定尝试弄清楚为什么我们首先需要序列化标记!谢谢。


查看异常的堆栈跟踪。 - Andrey
2个回答

2
实际的CurrentFilters值使用BinaryFormatter进行序列化并存储在.resx文件中。你几乎肯定不希望这种情况发生。首先,你会依赖包含QueryFilter类的程序集的[AssemblyVersion]号码。这应该解释了你现在遇到的“无法加载类型”异常。
首先找出在设计时如何为CurrentFilters赋值。你需要注意在设计时运行的事件。典型的候选者是构造函数和Load事件。使用Control.DesignTime属性来防止代码运行。
接下来,通过应用属性确保属性值不被持久化:
 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 public List<QueryFilter> CurrentFilters
 {
 }

非常准确。非常感谢您的时间。我已经点赞了这个答案,但是我认为绿色的勾号会给罗杰。我希望我能把它给你们两个,但看起来罗杰更需要它一些。你已经有足够的积分终身使用了! - JustLooking

2

一个及时而正确的答案!我非常感激。给你一个绿色勾号! - JustLooking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接