Подтвердить что ты не робот

Атрибут XmlText в сериализации базового класса

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

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

Произошла ошибка, отражающая тип '[имя типа]'. --- > System.InvalidOperationException: Невозможно сериализовать объект типа '[type имя]'. Базовый тип '[имя базового типа]' имеет 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>
{

}
4b9b3361

Ответ 1

Это похоже на то, что класс LookupItem не имеет дочернего элемента в представлении XML. Из-за этого XmlSerializer считает, что это элемент simpleContent XML. Если вы добавите новое свойство в 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 как атрибут или дочерний элемент.