Атрибут XmlText в базовом классе нарушает сериализацию

У меня есть базовый класс со свойством под названием Name, которое имеет атрибут XmlText.

Когда унаследованный класс сериализуется, я получаю исключение, говорящее:

Произошла ошибка, отражающая тип "[имя типа]". ---> System.InvalidOperationException: Невозможно сериализовать объект типа '[имя типа]'. Базовый тип "[имя базового типа]" имеет simpleContent и может быть расширен только путем добавления элементов XmlAttribute. Пожалуйста, подумайте об изменении члена XmlText базового класса на строковый массив.

Вот мои определения классов, ошибка происходит при сериализации в XML.

[Serializable]
public class LookupItem
{
    [System.Xml.Serialization.XmlAttribute()]
    public int ID { get; set; }

    [System.Xml.Serialization.XmlText()]
    public string Name { get; set; }
}

[Serializable]
public class Vendor : LookupItem
{
    public string ContactNumber { get; set; }
}

[Serializable]
public class Vendors : List<Vendor>
{

}

1 ответ

Решение

Кажется, это происходит потому, что LookupItem класс не имеет дочернего элемента в своем представлении XML. Из-за этого, XmlSerializer считает, что это элемент XML SimpleContent. Если вы добавите новое свойство в LookupItem, который должен быть сериализован как элемент XML, он работает нормально.

Я просто потратил несколько минут на просмотр доступных атрибутов сериализации XML, но не смог найти ни одного, который позволил бы указать, что тип НЕ является simpleContent элемент...

Поэтому я думаю, что вы могли бы заставить его работать, добавив фиктивное свойство или поле, которое вы никогда не используете в LookupItem учебный класс. Если вы никогда не назначите ему значение, оно останется нулевым и не будет сериализовано, но это предотвратит обработку вашего класса как simpleContent, Я знаю, что это грязный обходной путь, но я не вижу другого легкого пути...

public class LookupItem
{
    [System.Xml.Serialization.XmlAttribute()]
    public int ID { get; set; }

    [System.Xml.Serialization.XmlText()]
    public string Name { get; set; }

    public object _dummy;
}

(Кстати, обратите внимание, что Serializable Атрибут не нужен для сериализации XML.)

В любом случае, вам действительно нужно сериализовать Name как текст XML? Это довольно редко, обычно элементы XML имеют либо простое содержимое (текст), либо дочерние элементы... Сочетание того и другого затрудняет чтение XML, поэтому, если вы не обязаны это делать, я предлагаю вам сериализовать Name как атрибут или дочерний элемент.

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