Как десериализовать эту простую конфигурацию xml с помощью класса XmlSerializer? - PullRequest
0 голосов
/ 07 ноября 2008

У меня есть следующий xml, который я хочу десериализовать в класс

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <element1>String1</element1>
  <element2>String2</element2>
</root>

Я пытаюсь сериализовать его в следующий класс:

    [XmlRoot("root")]
    public class root
    {
        [XmlElement("element1")]
        internal string element1 { get; set; }

        [XmlElement("element2")]
        internal string element2 { get; set; }
    }

Когда я пытаюсь десериализовать его с помощью следующего кода, создается объект config, но строки имеют значение null.

     using (TextReader reader = new StreamReader(configFile))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(root));
            this.config = (root)serializer.Deserialize(reader);
        }

Я пытался использовать xsd.exe для создания xsd, а затем создать на его основе класс, но этот инструмент создает слишком много помех. Я думаю, что я здесь близко. Чего мне не хватает?

Ответы [ 4 ]

7 голосов
/ 07 ноября 2008

Нельзя сериализовать / десериализовать внутренние свойства - они должны быть открытыми.

5 голосов
/ 07 ноября 2008

Я согласен с Броди относительно природы вашей проблемы. Однако у вас может быть возражение против публикации этих полей. В прошлом я решил эту проблему, создав сериализуемый класс, единственная цель которого - чтение / запись .xml, и все его поля были общедоступными. Затем создайте новый класс, который является внешним интерфейсом. Он принимает сериализуемый класс в качестве аргумента конструктора, а внешний класс предоставляет открытые свойства, которые контролируют доступ к сериализуемому классу.

1 голос
/ 13 ноября 2008

Вы можете использовать XSD.exe для генерации класса из XSD (определение схемы XML). Это создает полезную структуру класса, которая может сериализовать и десериализовать соответствующий XML.

1 голос
/ 10 ноября 2008

Чтобы продолжить мою реализацию ... В итоге я отказался от использования класса XmlSerializer. Классы, которые я десериализовал, были довольно сложными и содержали списки других объектов, которые нужно было сериализовать. Количество атрибутов, которое я должен был добавить к своим классам, вызвало вонь кода

В итоге я использовал Linq to XML для десериализации .... Сложность делкараций классов снизилась, но оператор linq оказался довольно сложным.

Если бы я сделал это снова, я мог бы подумать об использовании WCF и сериализатора datacontract ... Это также может быть сложно сделать.

Мне любопытно, как люди десериализуют XML-документы в объекты в наши дни. После того, как я обдумал заявления Linq, я думаю, что это может быть путь. Объекты гораздо проще создавать, и они не должны быть публичными. Также кажется, что XmlSerializer - «старая школа», в то время как Linq to XML - больше «новая школа».

Мне бы очень хотелось услышать, что говорили другие.

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