Код, сгенерированный svcutil, требует xmlinclude

Я разрабатываю консольное приложение в VB NET с использованием WCF, которое взаимодействует с безопасной службой поставщика. Я хочу сериализовать как запрос, так и ответ на вызовы и сохранить их в файле XML для анализа. К сожалению, объект, который я пытаюсь сериализовать, сложен. Он основан на классах, созданных SVCUTIL из файлов WSDL и xsd, предоставленных поставщиком.

Вот код, который я написал (obj - сложный объект):

Dim sr As StreamWriter
Dim x As XmlSerializer

sr = New StreamWriter("U:\logs\Responses.xml")
x = New XmlSerializer(obj.GetType)
x.Serialize(sr, obj)

Когда я нажимаю метод Serialize, я получаю InvalidOperationException с сообщением InnerException: «Тип [сгенерированное имя класса] не ожидался. Используйте атрибут XmlInclude или SoapInclude, чтобы указать типы, которые не известны статически. '

Как упоминалось ранее, это всего лишь один из нескольких классов, созданных SVCUTIL и включенных в мое приложение. Есть ли способ заставить SVCUTIL выдавать атрибут XMLInclude для всех этих классов? WSDL может быть изменен поставщиком, и я бы не хотел, чтобы снова вручную добавляли атрибут для всех этих классов, когда это произойдет.

Атрибуты, сгенерированные SVCUTIL для каждого класса, обычно выглядят следующим образом:

<System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.0.30319.1"),  _
 System.SerializableAttribute(),  _
 System.Diagnostics.DebuggerStepThroughAttribute(),  _
 System.ComponentModel.DesignerCategoryAttribute("code"),  _
 System.Xml.Serialization.XmlTypeAttribute([Namespace]:="[Vendor Specific].xsd")>

Это команда, которую я использую в настоящее время для создания прокси-классов:

svcutil *.wsdl *.xsd /language:vb /async /tcv:Version35 /out:VendorAsync.vb /config:VendorAsync.config

Я добавил параметры / ImportXMLTypes / SER: XMLSerializer в указанную выше команду без каких-либо изменений в сгенерированных прокси-классах.

В этой ветке обсуждается / ссылка вариант свкутил. Я не знаю, поможет ли это, и я не уверен, что указывать для пути. Эта ссылка предполагает, что / reference не поможет решить мою проблему с XMLSerializer.

Вот другой поток, который кажется вроде бы актуально. Любое руководство, безусловно, будет оценено.


Я нашел эту ветку, которая действительно помогла мне наконец обойти проблему сериализатора! Теперь это работает как шарм. По сути, все, что вам нужно сделать, это вызвать метод сериализатора с параметром extraTypes, например:

x = New XmlSerializer(obj.GetType, extraTypes)

ExtraTypes - это массив типов, который мне удалось довольно легко построить, поскольку все типы были включены в прокси-классы, созданные SVCUTIL.

Dim extraTypes As Type() = 
   {GetType(type1),
    GetType(type2),
    GetType(type3),
    GetType(type4)}

person Ebassador    schedule 27.03.2014    source источник


Ответы (1)


Используйте параметр extraType метода xmlserializer. См. Обновленные комментарии, включенные в исходный пост.

person Ebassador    schedule 31.03.2014