Атрибут XmlText в базовом классе нарушает сериализацию - PullRequest
11 голосов
/ 23 марта 2010

У меня есть базовый класс со свойством 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 Ответ

15 голосов
/ 23 марта 2010

Кажется, это происходит потому, что класс 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 как атрибут или дочерний элемент.

...