Как сериализировать класс, который содержит объекты других классов (рекурсивная сериализация?)

Как я могу сделать это? Или сериализатор автоматически пойдет с рекурсией и сериализирует все те дочерние объекты в XML?

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

Я попробовал это, и это ничего не производило (кроме заголовка XML) к целенаправленному XML-файлу.

Моя проблема состоит в том, что я должен сериализировать простой класс, который просто содержит Объект списка. Но, те Объекты также Объекты списка лотка. (Другой плюс был бы то, если я мог бы избежать сериализации некоторых компонентов, потому что некоторые получены и имеют словари в них).

public void SaveCurrent(string MapFileName)
{
    string MapPath = world_.game_.Content.RootDirectory + "/Maps/" + MapFileName + ".xml";
    StreamWriter MapWriter = new StreamWriter(MapPath);

    Map SavedMap = new Map();
    SavedMap.Entities = world_.Entities;
    XmlSerializer xSerializer = new XmlSerializer(SavedMap.GetType());

    xSerializer.Serialize(MapWriter, SavedMap);
    MapWriter.Close();
}

Это - часть кода, который делает сериализацию.

public class Map
{
    internal string MapName;
    internal string MapDescription;
    internal string MapAuthor;
    public List<Entity> Entities = new List<Entity>();
}

И это - класс, это сериализируется. Внутренности могли считаться как общественность, если сериализацию называют от того же блока? Код выдает исключение в SavedMap.GetType() функция, и я попробовал typeof(Map) также, но без успеха. Я предполагаю, что это - потому что мне нужен некоторый другой способ обработать каждый новый класс (глубокая сериализация), как я делаю это?

Кроме того, я нашел на некоторых примерах, что нет никакого интерфейсного наследования или атрибутов, поэтому я не добавил их также, но я планирую использовать IXmlSerializable, хотя я не знаю, как назвать другую сериализацию в реализации WriteXML.

15
задан Sri Harsha Chilakapati 28 March 2013 в 10:51
поделиться

3 ответа

О проблеме с типами, о которой упоминал Джош Эйнштейн, вам не нужно работать с атрибутом XmlInclude: вы также можете передать список типов сериализатору (сигнатура - XmlSerializer(Type baseType, Type[] extraTypes)). Это следует сделать, особенно если есть вероятность, что список дополнительных типов растет со временем.

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

EDIT : необработанный пример :

public abstract class Animal
{
}

public class Dog : Animal
{
}

public class Cat : Animal
{
}

public static class AnimalSerializer
{
    public static void Serialize(List<Animal> animals, Stream stream)
    {
        List<Type> animalTypes = new List<Type>();
        foreach (Animal animal in animals)
        {
            Type type = animal.GetType();
            if (!animalTypes.Contains(type))
            {
                animalTypes.Add(type);
            }
        }
        XmlSerializer serializer = new XmlSerializer(typeof(List<Animal>), animalTypes.ToArray());
        serializer.Serialize(stream, animals);
    }
}
2
ответ дан 1 December 2019 в 04:40
поделиться

Это будет сериализовать весь график объекта (объект и любые объекты, которые он подвергается публичным элементам, рекурсивно) до тех пор, пока все объекты на графике являются сериализация. Различные сериализаторы имеют разные правила для того, что является сериализуемым. Например, XMLSerializer нуждается в общественном конструкторе по умолчанию.

Кроме того, сериализатор XML должен быть в состоянии сказать, какие типы он будет сериализовать только на информации о типе и атрибутах на этих типах. Так сказать, например, у вас есть класс, который имеет свойство животного типа, но во время выполнения XMLSerializer находит объект типа типа собаки. Чтобы поддержать это вам нужно будет использовать атрибут xmlinclude , чтобы позволить ему заранее знать, что ему нужно поддерживать собаку.

Для того, чтобы удерживать части объекта графа из сериализованного выхода, вы бы использовали атрибут XMLIGNORE . Различные серии также имеют разные атрибуты для включения / игнорирования и т. Д.

Надеюсь, что это поможет уточнить немного. Вы также можете захотеть прочитать в эту тему в MSDN .

3
ответ дан 1 December 2019 в 04:40
поделиться

Сколько тебе нужно контроля? Вы всегда можете реализовать IXmlSerializable -

http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx

2
ответ дан 1 December 2019 в 04:40
поделиться
Другие вопросы по тегам:

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