Сериализация XML - System.InvalidOperationException: невозможно ли сериализовать «это»? - PullRequest
0 голосов
/ 28 февраля 2019

Надеюсь, этот вопрос не слишком очевиден, однако я делаю первые шаги в теме сериализации и не могу найти объяснения для следующего поведения:

Я хотел сериализовать класс дляпроверить, правильно ли я все настроил.Для этого я взял код из этого урока и адаптировал его следующим образом:

    private void SerializePresets(string path)
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyClass));
        using (TextWriter writer = new StreamWriter(path))
        {
            xmlSerializer.Serialize(writer, this);
        }
    }

Этот метод находится в пределах MyClass и также вызывается оттуда.Это дает мне следующее исключение:

Исключение типа 'System.InvalidOperationException' произошло в System.Xml.dll, но не было обработано в коде пользователя

Дополнительная информация:ошибка, отражающая тип 'MyClass'.

Так как MyClass сначала содержит другой объект класса в качестве свойств, я подумал, что я должен сделать эти сериализуемые тоже, но исключение все еще сохраняется.Итак, я предполагаю, что невозможно сериализовать this, однако я не смог найти подтверждения этой догадке.

РЕДАКТИРОВАТЬ: Это свойство вызывает проблему в соответствии с внутренним исключением:

[XmlArray("VolumePresetList"), XmlArrayItem(typeof(LinearAxisColorPresetsModel), ElementName = "VolumePresetList")]
public ObservableCollection<LinearAxisColorPresetsModel> VolumePresetList { get; set; }

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

С помощью внутренних исключений (еще раз спасибо за подсказку) я смог выяснить причину сбоя сериализации.

В классе LinearAxisColorPresetsModel не было конструктора без параметров, который вызвал эту проблему.

Простое добавление

/// <summary>
/// Default Constructor
/// </summary>
private LinearAxisColorPresetsModel()
{

}

к этому классу решило проблему для меня.Осталось выяснить причину, почему у нас должен быть конструктор без параметров.

РЕДАКТИРОВАТЬ: Обнаружил причины этого поведения в этом посте.

0 голосов
/ 28 февраля 2019

Вы можете использовать это.Это должно быть одно из свойств, таких как Словарь, который не сериализуется.Смотрите мой пример ниже

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
using System.IO;

namespace ConsoleApplication103
{
    class Program
    {

        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            MyClass myClass = new MyClass();
            myClass.Serialize(FILENAME);

        }
    }
    public class MyClass
    {
         public string test { get; set; }

         public void Serialize(string filename)
         {
             SerializePresets(filename);
         }
         private void SerializePresets(string path)
         {
             XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyClass));
             using (TextWriter writer = new StreamWriter(path))
             {
                 xmlSerializer.Serialize(writer, this);
             }
        }
    }

}
...