Как сериализовать пользовательский объект, агрегируя другие пользовательские объекты

Я пытаюсь сериализовать пользовательский объект в файл. Я много чего пробовал, но никто не работает, наверное, я что-то пропустил.

Здесь проблема.

У меня есть одноэлементный класс, который я использую для хранения своих объектов. Вот код:

using DataLibrary.Model.Tests;
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using System.Xml.Serialization;
using testsPsychotechniques.View;

namespace testsPsychotechniques.Model
{
    [Serializable()]
    public class testSaver : ISerializable
    {
        private String lastName;
        private String firstName;
        private List<ITest> tests;


        public static testSaver Instance
        {
            get
            {
                return Nested.instance;
            }
        }

        public void addTest(ITest test)
        {
            tests.Add(test);
        }

        public Boolean save()
        {
            try
            {
                FileStream file = File.Open(".\\result.data",
                                            FileMode.Create,
                                            FileAccess.ReadWrite,
                                            FileShare.None);

                XmlSerializer serializer = new XmlSerializer(typeof(testSaver));
                serializer.Serialize(file, testSaver.Instance);
                file.Close();
                return true;
            }
            catch
            {
                return false;
            }
        }

        private testSaver()
        {
            this.firstName = Identification.firstName;
            this.lastName = Identification.lastName;
            this.tests = new List<ITest>();
        }


        private class Nested
        {
            internal static readonly testSaver instance = new testSaver();
        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("lastName", this.lastName);
            info.AddValue("firstName", this.firstName);
            info.AddValue("testsResults", this.tests);
        }
    }
}

Теперь настоящая проблема:

Когда я вызываю метод save, в сгенерированном XML-файле у меня есть только эти данные:

<?xml version="1.0"?>
<testSaver xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />

Классы, реализующие ITest Все интерфейсы помечены как сериализуемые и имеют метод getObjectData.

Еще один намек на то, что функции getObjectData никогда не используются.

Спасибо за любую помощь

1 ответ

Решение

XmlSerializer не использует [Serializable] атрибут или ISerializable интерфейс.

У вас есть два варианта здесь:

  1. Продолжайте использовать XmlSerializer в этом случае вам нужны открытые свойства и открытый конструктор noarg.
  2. + Изменить XmlSerializer в SoapFormatter и продолжать использовать либо [Serializable] или же ISerializableВам не нужны оба.

Это действительно зависит от того, в каком формате вы хотите использовать Xml и предпочитаете ли вы атрибуты или код для управления сериализацией. Я бы выбрал вариант 1, так как он в целом проще.

Другие вопросы по тегам