Как сериализовать список экземпляров, вложенных в класс? - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь сохранить класс в файл с сериализацией, он работает для всех свойств, но не может сериализовать вложенный класс.

Предполагается, что мой класс представляет задачу с именем, описанием, ..... и его можно составить с помощью подзадачи, которая представлена ​​списком задач

Я попытался написать [Serializable] перед моим списком, как объяснить здесь: Сериализация вложенных классов в c #?

но я получаю эту ошибку: «Атрибут« Сериализуемый »недопустим для этого типа объявления. Он действителен только для объявлений.»

[Serializable()]
public class t_Task
{
   private string nom;
   private string description;
   [Serializable]
   List<t_Task> subTask;
}

Как получить все классы в спискетакже сериализуйте, пожалуйста?

Редактировать: Я сериализую, используя метод, найденный здесь: http://blog.danskingdom.com/saving-and-loading-a-c-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);
        }

1 Ответ

0 голосов
/ 11 мая 2019

[Serializeable] недопустимо в полях / свойствах и должно быть указано только в классе. Ваш класс должен быть сериализуемым просто так:

[Serializable()]
public class t_Task
{
   private string nom;
   private string description;
   List<t_Task> subTask; // Removed the [Serializeable] attribute
}

Важно отметить, что ваш List<t_Task> не является вложенным классом (это просто обычное поле класса), поэтому ссылка, на которую вы ссылаетесь, на самом деле не связана с вашей проблемой.

[Serializable] - относительно старый метод маркировки для сериализации. Я хотел бы сослаться на документацию Microsoft на 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 есть много других способов сериализации, которые немного более современны. Возможно, стоит прочитать об этом. Однако, если вас интересует только простой двоичный формат, приведенной выше информации должно быть достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...