Атрибут 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
как атрибут или дочерний элемент.