序列化类时未标记为可序列化错误

我使用这个代码使用BinaryFormatter序列化结构:

 private void SerializeObject(string filename, SerializableStructure objectToSerialize) { Stream stream = File.Open(filename, FileMode.Create); BinaryFormatter bFormatter = new BinaryFormatter(); bFormatter.Serialize(stream, objectToSerialize); stream.Close(); } 

哪个objectToSerialize是我的结构,我正在调用这个函数:

 SerializableStructure s = new SerializableStructure(); s.NN = NN; s.SubNNs = SubNNs; s.inputs = inputs; SerializeObject(Application.StartupPath + "\\Save\\" + txtSave.Text + ".bin", s); 

哪个SerializableStructure ,以及NNSubNNs和输入的类型是可序列化的。 (输入包含一些PointsRectangles和通用列表)。

现在,当我运行我的代码时,我收到了这个错误:

在Assembly’MainProject中输入’MainProject.Main’,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null’未标记为可序列化。

为什么我会收到这个错误? Main是我的表单,这些变量位于我的表单中。

我已成功使用MemoryStream和VB.NET序列化NN类型,但我不知道为什么我收到此错误?

这是我的结构的定义:

SerializableStructure:

 [Serializable()] public class SerializableStructure { public List inputs = new List(); public NeuralNetwork NN; public NeuralNetwork[] SubNNs; } 

输入:

 [Serializable()] public class Inputs { public string XPath { get; set; } public string YPath { get; set; } public string ImagePath { get; set; } public string CharName { get; set; } public string CharBaseName { get; set; } public List x { get; set; } public List y { get; set; } public List DotsX { get; set; } public List DotsY { get; set; } public List GravityCenters { get; set; } public List Bounds { get; set; } public override string ToString() { return CharName; } public Inputs(string xPath, string yPath, string imagePath, string charName, string charBaseName) { XPath = xPath; YPath = yPath; ImagePath = imagePath; CharName = charName; CharBaseName = charBaseName; x = new List(); y = new List(); GravityCenters = new List(); Bounds = new List(); } } 

NN也是非常大的结构(!)。

这几乎意味着您在对象模型中的某个地方有一个事件(或其他委托 – 可能是一个回调),它试图被序列化。 将[NonSerialized]添加到任何事件备份字段。 如果您正在使用类似字段的事件(最有可能的类型),这是:

 [field:NonSerialized] public event SomeDelegateType SomeEventName; 

或者:大多数其他序列化程序不查看事件/委托,并提供更好的版本兼容性。 切换到XmlSerializer,JavaScriptSerializer,DataContractSerializer或protobuf-net(仅4个示例)也可以通过不尝试这样做的简单方法来解决这个问题(您几乎从不打算将事件视为DTO的一部分)。

问题是您正在尝试序列化从Form派生的类。 Form类从根本上是不可序列化的。 它具有大量与运行时相关的内部状态。 这开始于一个明显的属性,如Handle,一个总是不同的值。 不太明显的是像Size这样的属性,取决于用户首选项,例如窗口标题的字体大小。 结束控件的所有文本,位置和大小,它们受本地化的限制。 序列化Form对象可以随时在任何地方正确反序列化以创建表单的精确克隆的几率为零。

微软在编写代码时没有对它做任何不了解,他们只是省略了类声明中的[Serializable]属性。 这就是你得到例外的原因。

你必须瞄准更低,写自己的类来捕捉你的forms的状态。 并赋予它属性。 您需要编写一堆代码,在表单和控件属性之间映射到该类的对象,来回。