2010-03-23 4 views
11

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

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

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

} 

ответ

15

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

Смежные вопросы