我正在尝试将一个类保存到一个带有序列化的文件中,它适用于所有属性,但无法序列化嵌套类。
我的班级假设代表一个带有名称、描述、...的任务,它可以由由任务列表表示的子任务组成
我已经尝试在我的列表之前写 [Serializable],就像这里的解释一样:Serialize Nested Classes in c#?
但我收到此错误:“属性 'Serializable' 在此声明类型上无效。它仅对声明有效。”
[Serializable()]
public class t_Task
{
private string nom;
private string description;
[Serializable]
List<t_Task> subTask;
}
如何让列表中的所有类也序列化?
编辑:我正在使用此处找到的方法进行序列化:http : //blog.danskingdom.com/saving-and-loading-ac-objects-data-to-an-xml-json-or-binary-file/
public static void WriteToBinaryFile<T>(string filePath, T objectToWrite, bool append = false)
{
using (Stream stream = File.Open(filePath, append ? FileMode.Append : FileMode.Create))
{
var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
binaryFormatter.Serialize(stream, objectToWrite);
}
}
然后我用接近这个的方法调用它
public void Save()
{
GesionBinaryFileIO.WriteToBinaryFile<t_Task>(PathToFile, this);
}
[Serializeable]
不允许用于字段/属性,只需要放在类上。你的类应该是可序列化的,就像这样:
[Serializable()]
public class t_Task
{
private string nom;
private string description;
List<t_Task> subTask; // Removed the [Serializeable] attribute
}
重要的是要注意您List<t_Task>
的不是嵌套类(它只是一个常规类字段),因此您引用的链接实际上与您的问题无关。
[Serializable]
是一种相对较旧的序列化标记方法。我将引用微软文档上SerializeableAttribute
怎么看你的代码可以工作。
这是基于我链接的 Microsoft 文章的示例:
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace ConsoleOne
{
[Serializable()]
public class t_Task
{
private string nom = "test"; // Added for test data.
private string description = "desc"; // Added for test data
List<t_Task> subTask = new List<t_Task>();
public void AddTask()
{
this.subTask.Add(new t_Task());
}
public override string ToString()
=> $"{nom}-{description}-{subTask?.Count}";
}
class Program
{
static void Main(string[] args)
{
var task = new t_Task()
{
};
task.AddTask();
task.AddTask();
// Opens a file and serializes the object into it in binary format.
Stream stream = File.Open("data.xml", FileMode.Create);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, task);
stream.Close();
//Empties obj.
task = null;
//Opens file "data.xml" and deserializes the object from it.
stream = File.Open("data.xml", FileMode.Open);
formatter = new BinaryFormatter();
//formatter = new BinaryFormatter();
task = (t_Task)formatter.Deserialize(stream);
stream.Close();
Console.WriteLine($"{task}");
Console.ReadLine();
}
}
}
注意:.NET 中还有许多其他更现代的序列化途径。关于这些也可能值得一读。但是,如果您只对简单的二进制格式感兴趣,那么上述信息就足够了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句