gpt4 book ai didi

c# - 尝试在 C# 中序列化对象时引用主窗体

转载 作者:行者123 更新时间:2023-11-30 17:10:06 25 4
gpt4 key购买 nike

我的主窗体上有一个按钮,它调用一个方法将一些对象序列化到磁盘。我正在尝试将这些对象添加到 ArrayList,然后使用 BinaryFormatter 和 FileStream 将它们序列化。

   public void SerializeGAToDisk(string GenAlgName)
{
// Let's make a list that includes all the objects we
// need to store a GA instance
ArrayList GAContents = new ArrayList();
// Structure and info for a GA
GAContents.Add(GenAlgInstances[GenAlgName]);
// There may be several running GA's
GAContents.Add(RunningGAs[GenAlgName]);

using (FileStream fStream = new FileStream(GenAlgName + ".ga",
FileMode.Create, FileAccess.Write, FileShare.None))
{
BinaryFormatter binFormat = new BinaryFormatter();
binFormat.Serialize(fStream, GAContents);
}
}

运行上述代码时出现以下异常:

System.Runtime.Serialization.SerializationException 未处理 Message=Type 'WindowsFormsApplication1.Form1' in Assembly 'GeneticAlgApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 未标记为可序列化。

所以这意味着我要保存的对象中的某处必须有对主窗体的引用。我能看到的唯一可能的引用是 3 个委托(delegate),它们都指向主窗体代码中的方法。代表也得到序列化吗?我似乎无法将 [NonSerialized] 属性应用于它们。

还有什么我可能遗漏的吗?更好的是,有没有一种快速的方法可以找到导致问题的引用文献?

更新:

好吧,我通过将委托(delegate)保存到临时变量中然后在序列化之前将它们设置为 null 来让我的代码工作。然后我将它们设置回原始值。似乎应该有更好的方法来做到这一点。有什么意见吗?

回答:

除了在序列化之前将它们设置为 null 之外,我想不出一种方法来阻止我的委托(delegate)被序列化,但是我认为最好的解决方案是更改我的代码以改为使用事件。正如 Mark Gravell 在他的回答中所说,通过使用 [field:Nonserialized] 属性标记事件可以从序列化中省略。问题解决了。实际上没有人提出这个建议,但我猜 Mark 的回答是最接近的。

最佳答案

这几乎总是意味着您已经从表单订阅了一个事件。是的,在使用 BinaryFormatter 时,委托(delegate)字段默认是序列化的,这意味着事件 是序列化的。检查您的事件:您通常应该标记支持委托(delegate) [NonSerialized]。对于类似字段的事件,请使用 [field:NonSerialized]。例如:

[field:NonSerialized]
public event EventHandler Foo;

或:

[NonSerialized]
private EventHandler foo;

public event EventHandler {
add { foo += value; }
remove { foo -= value; }
}

关于c# - 尝试在 C# 中序列化对象时引用主窗体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12347953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com