Сериализация XML.NET и пустые наборы

У меня есть класс с некоторыми наборами в них, и я хотел бы сериализировать экземпляры этого класса к XML, не имея необходимость инициализировать наборы, чтобы быть пустым, и не имея необходимость реализовывать IXmlSerializable. Я не забочусь, создает ли это пустые элементы или не создает элементы вообще. Просто то, что это работает, не имея необходимость инициализировать набор для каждого основанного на наборе свойства.

У меня есть взгляд на все атрибуты XML, я могу украсить свойства и не имел никакого успеха с этим. Это походит на простую вещь сделать, который является, может иметь элемент или просто ни один вообще. Затем, когда это десериализовывается, это просто оставило бы их пустыми или проигнорировало бы их период.

Вот простая версия класса для использования для работы через эту проблему. Используя это и значения по умолчанию Вы получаете исключение "Ссылка на объект не набор к экземпляру объекта" из-за наборов, являющихся пустым;

public class MyClass
{
    public string Name { get; set; }
    public bool IsAlive { get; set; }
    public List<Car> Cars { get; set; }
    public List<Home> Homes { get; set; }
    public List<Pet> Pets { get; set; }

    public void ToXmlFile(string fileName)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
        TextWriter writer = new StreamWriter(fileName);
        serializer.Serialize(writer, this);
        writer.Close();
    }
}

РЕДАКТИРОВАНИЕ спасибо за помогает парням, оказывается, что проблема была в моем методе GetHashCode, который не обработал пустой указатель правильно. После того как я зафиксировал, это все было хорошо. Я отметил первый для ответа как являющийся корректным. Извините за Отвлекающий маневр, но работающий через него с Вами парни действительно помогали.

5
задан John Saunders 27 January 2010 в 00:52
поделиться

4 ответа

Вам не нужно инициализировать коллекции для того, чтобы сериализовать класс в XML. Вот простая программа для демонстрации:

class Program
{
    static void Main(string[] args)
    {
        MyClass c = new MyClass() { Name = "Test", IsAlive = true };
        XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
        using (MemoryStream ms = new MemoryStream())
        {
            serializer.Serialize(ms, c);
            Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
        }
        Console.ReadLine();
    }
}

Она выведет следующий вывод:

<?xml version="1.0"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>Test</Name>
  <IsAlive>true</IsAlive>
</MyClass>

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

5
ответ дан 14 December 2019 в 19:13
поделиться

Вы упоминаете исключение во время (de) сериализации; То, что вы должны работать хорошо (по крайней мере, в соответствии с тем, как вы определяете вопрос). Интересно, есть ли у вас на самом деле:

public class MyClass
{
    public string Name { get; set; }
    public bool IsAlive { get; set; }
    public List<Car> Cars { get; private set; }
    public List<Home> Homes { get; private set; }
    public List<Pet> Pets { get; private set; }
}

(не редкость не хотеть общественного сеттера)

Ну, XMLSerializer - это суетятся об этом; Вам либо нужен общественный сеттер, либо (как кто-то недавно указал) NO Установка; Например:

public class MyClass
{
    public string Name { get; set; }
    public bool IsAlive { get; set; }
    private readonly List<Car> cars = new List<Car>();
    public List<Car> Cars { get { return cars; } }
    private readonly List<Home> homes = new List<Home>();
    public List<Home> Homes { get { return homes; } }
    private readonly List<Pet> pets = new List<Pet>();
    public List<Pet> Pets { get { return pets; } }
}
0
ответ дан 14 December 2019 в 19:13
поделиться

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

0
ответ дан 14 December 2019 в 19:13
поделиться

Думаю, установка типа возврата метода XMLSerialisation на bool позволит более безопасно обрабатывать ошибки по сравнению с текущим методом:

public bool ToXmlFile(string fileName)
{
    if(fileName != "")
    {
       XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
       TextWriter writer = new StreamWriter(fileName);
       serializer.Serialize(writer, this);
       writer.Close();
       return true;
    }
    return false;
}

Который затем может быть использован так:

if(ToXMLFile)
{
     MessageBox.Show("Save Succesful");
}
else
(
     MessageBox.Show("Save unsuccesful");
)

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

0
ответ дан 14 December 2019 в 19:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: