2011-02-07 22 views
4

System.Web.Services.Protocols.SoapException: сервер не смог обработать запрос. ---> System.InvalidOperationException: произошла ошибка генерации XML-документа. ---> System.InvalidOperationException: Тип ProfileChulbul не ожидался. Используйте атрибут XmlInclude или SoapInclude, чтобы указать типы, которые не известны статически. на System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive (имя String, String нс, объект О, булева xsiType) в Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterProfileDefinitionExportHolder.Write1_Object (String, String п нс, объект О, булевой IsNullable, Логическое needType)Я получаю сообщение об ошибке при попытке XML-сериализации объекта

, если вы видите «ProfileChulbul» является объектом, я пытаюсь сериализации

Любая идея, почему так?

Thanx

+0

немного больше информации? – Fredou

+0

Опубликовать код пожалуйста – BrokenGlass

+0

BreakHead, вопрос по-прежнему невероятно расплывчатый. Пожалуйста, отправьте код для класса, который вы пытаетесь сериализовать. –

ответ

17

Это происходит, когда тип, который вы сериализуете, имеет свойство типа, который не является статически известным экземпляру сериализатора. Например, если тип ProfileChulbul имеет базовый тип, на который ссылается то, что вы сериализуете, сериализатор не знает, как с ним работать.

У вас есть несколько вариантов решения этой проблемы:

  • Добавить атрибут [XmlInclude(typeof(ProfileChulbul))] (и дополнительные атрибуты для любых других типов, которые будут использоваться) для ProfileChulbul «s базового класса

  • Изменить класс, который вы используете для сериализации, для использования дженериков вместо объекта

  • Провод typeof(ProfileChulbul) (и любые другие типы, которые будут использоваться) в сериализаторе co nstructor во время выполнения, например, так:

    var knownTypes = new Type[] { typeof(ProfileChulbul), typeof(ProfileSomethingElse) };

    var serializer = new XmlSerializer(typeof(TheSerializableType), knownTypes);

+1

Thanx Daniel, Stack Overflow rocks :) – BreakHead

+0

Отличный ответ. Спасибо за это! – Jemes

1

На основании части StackTrace «Использование XmlInclude или SoapInclude атрибут, чтобы указать типы, которые не известны статически», я бы пари, что вы пытаетесь сериализовать интерфейс или коллекцию интерфейсов? Xml Serialization не позволяет этого, попробуйте маркировать интерфейс с атрибутами XmlInclude.

+0

Итак, как мне это сделать, потому что объект, который я получаю для сериализации, является общим объектом. – BreakHead

+1

BreakHead, это именно то, что вызывает ошибку. Можете ли вы использовать дженерики вместо простого старого объекта? –

+0

+1 у меня был такой же опыт :-(теперь я использую [sharpserializer] (http://www.sharpserializer.com/en/index.html), который может обрабатывать xml- (de-) сериализации. – k3b

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