gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:39:12 28 4
gpt4 key购买 nike

我正在使用 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);

SerializableStructureNN 类型、SubNN 和输入是可序列化的。 (输入包含一些 PointsRectangles 和通用列表)。

现在,当我运行我的代码时,出现以下错误:

Type 'MainProject.Main' in Assembly 'MainProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

为什么会出现此错误? Main 是我的表单,这些变量位于我的表单中。

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

这是我的结构的定义:

可序列化结构:

[Serializable()]
public class SerializableStructure
{
public List<Inputs> inputs = new List<Inputs>();
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<double> x { get; set; }
public List<double> y { get; set; }
public List<double> DotsX { get; set; }
public List<double> DotsY { get; set; }
public List<Point> GravityCenters { get; set; }
public List<Rectangle> 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<double>();
y = new List<double>();
GravityCenters = new List<Point>();
Bounds = new List<Rectangle>();
}
}

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

最佳答案

这几乎总是意味着您的对象模型中某处有一个事件(或其他委托(delegate) - 可能是回调)正在尝试序列化。将 [NonSerialized] 添加到任何事件支持字段。如果您使用的是类似字段的事件(最有可能的那种),这是:

[field:NonSerialized]
public event SomeDelegateType SomeEventName;

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

关于c# - 序列化类时未标记为可序列化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8624137/

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