XmlSerialization не будет работать - PullRequest
0 голосов
/ 06 марта 2012

В настоящее время мы разрабатываем приложение с помощью XmlSerializer из .NET Framework.

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

[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 не ожидался».

РЕДАКТИРОВАТЬ: В моем коде не хватает нескольких вещейпредоставлена.Я добавил некоторые исправления в это;подробнее в комментариях.

Ответы [ 2 ]

0 голосов
/ 06 марта 2012

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

0 голосов
/ 06 марта 2012

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

[XmlInclude(typeof(TimeLineMediaClass))]

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

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

...