2012-03-06 4 views
0

В настоящее время мы разрабатываем приложение с использованием XmlSerializer из платформы .NET.XmlSerialization не будет работать

Вот структура наших классов:

[XmlInclude(typeof(TimeLineMediaClass))] 
[XmlInclude(typeof(ImageMediaClass))] 
public abstract class MediaClass 
{ 
    public string filename { get; set; } 
    public string maintitle { get; set; } 
    public string subtitle { get; set; } 
    public Type typeOfMedia { get; set; } 
} 

[XmlInclude(typeof(AudioMediaClass))] 
[XmlInclude(typeof(VideoMediaClass))] 
public abstract class TimeLineMediaClass : MediaClass 
{ 
    public string title { get; set; } 
    public TimeSpan length { get; set; } 
    public string genre { get; set; } 
} 

public class AudioMediaClass : TimeLineMediaClass 
{ 
    public string artist { get; set; } 
} 

public class VideoMediaClass : TimeLineMediaClass 
{ 
    public string director { get; set; } 
    public string studios { get; set; } 
} 

public class ImageMediaClass : MediaClass 
{ 
    public string width { get; set; } 
    public string height { get; set; } 
} 

В список добавлено несколько медиа разных типов, и это то, что мы хотим сериализовать.

Это как инстанциирован сериализатор:

XmlSerializer serializer = new XmlSerializer(typeof(List<MediaClass>)); 

Но когда мы запускаем программу и попытаться сериализации, генерируется исключение, заявив, что «AudioMediaClass не ожидается».

EDIT: В коде, который я предоставил, было несколько вещей. Я добавил некоторые исправления; подробнее в комментариях.

+0

Это, по-видимому, проблема с пространством имен xml (xmlns). Вы используете xmlns в любом месте атрибута. Если да, удалите его и посмотрите, работает ли он –

+0

Где находится ImageMediaClass? –

+0

Эй, Джон, ты решаешь свою проблему? –

ответ

0

Вы должны украсить свой MediaClass класс с

[XmlInclude(typeof(TimeLineMediaClass))] 

В вашем примере выше, у вас есть корпус неправильно на TimelineMediaClass означает образец не будет компилировать для меня. Если вы его удалите или у вас do есть класс с этим именем, вы получите сообщение об ошибке.

Как только вы исправляете корпус, он должен работать - это для меня [отметив, что мне также пришлось удалить атрибут для ImageMediaClass, который также не существует в вашем примере].

0

Я копирую ваш код и запускаю удаление [XmlInclude(typeof(ImageMediaClass))] и исправляю этот атрибут: [XmlInclude(typeof(TimelineMediaClass))] до [XmlInclude(typeof(TimeLineMediaClass))]. Теперь, выполняя свой код, он отлично работает.