如何序列化嵌套在类中的实例列表?

纽克斯

我正在尝试将一个类保存到一个带有序列化的文件中,它适用于所有属性,但无法序列化嵌套类。

我的班级假设代表一个带有名称、描述、...的任务,它可以由由任务列表表示的子任务组成

我已经尝试在我的列表之前写 [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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

反序列化嵌套在数组中的对象

反序列化嵌套在自身中的 XML 节点

使用C#中的嵌套类反序列化JSON。在哪里创建对象实例?

如何使用Jackson ObjectMapper序列化从JSON响应中替换空字段(嵌套在所有级别)?

如何反序列化嵌套在另一个标签的文本部分中的标签?

反序列化JSON复杂到Java,类嵌套在多个层次深

如何处理Findbugs“可序列化类中的非瞬态不可序列化实例字段”?

当序列化程序嵌套在 Django 中的另一个序列化程序中时,如何在 URL 中过滤该序列化程序?

在嵌套序列化程序的字段中访问序列化程序实例

Json to C#反序列化嵌套在对象中的对象

如何从.java文件(Java)外部实例化嵌套在类内部的类?

如何序列化WCF Web服务中通用函数上的嵌套类以在REST中使用?

如何使用RestTemplate反序列化嵌套列表?

如何使用嵌套列表反序列化 Json

序列化和反序列化嵌套类

如何使用 django rest 框架从创建嵌套序列化中返回 id 列表

反序列化JSON类实例

JSON序列化类继承列表中的属性

覆盖列表序列化程序类中的to_representation

嵌套类的JSON(反)序列化

我如何忽略使用Jackson序列化列表中的类?

序列化嵌套列表或替代

如何在Django中序列化模型实例?

如何从Django中的序列化器获取实例

如何在Django REST Framework中创建多个没有重复的可写嵌套序列化器的模型实例?

如何将相关序列化器中的嵌套查询集限制为相关模型实例的子集?

Java中的Jackson JSON序列化-将k / v对写入根目录,而不是嵌套在属性名称中

如何反序列化嵌套数组中的字段

反序列化为反序列化类中的列表?