C # Сериализация / десериализация в / из WebService (опубликованная схема BizTalk) с пространством имен - PullRequest
0 голосов
/ 27 июня 2018

У меня есть консольная программа на C # со ссылкой веб-службы на опубликованную схему BizTalk. Это огромная скверная программа, и я пытаюсь создать небольшой тестовый комплект, чтобы просто извлечь XML-файл и опубликовать его, но убедиться, что он соответствует.

Когда я строю объект в памяти и сериализую его, он выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<Outbound210 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Transaction xmlns="http://ABC.Integrations/" />
</Outbound210>

Основной вопрос заключается в том, почему пространство имен "http://ABC.Integrations" находится на элементе, а не на корневом элементе. Следствием этого является то, что если я пытаюсь сериализовать файл с этим пространством имен в корне, я получаю сообщение об ошибке:

Исключение: в документе XML есть ошибка (1,2) Внутреннее исключение: не ожидалось.

Корень схемы называется «Outbound210», а первая часть reference.cs (построена из WSDL показана ниже).

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34234")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://ABC.Integrations/")]
public partial class Outbound210 : object, System.ComponentModel.INotifyPropertyChanged {

    private Outbound210Transaction transactionField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=0)]
    public Outbound210Transaction Transaction {
        get {
            return this.transactionField;
        }
        set {
            this.transactionField = value;
            this.RaisePropertyChanged("Transaction");
        }
    }

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34234")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://ABC.Integrations/")]
public partial class Outbound210Transaction : object, System.ComponentModel.INotifyPropertyChanged {
    etc...

Код для десериализации:

Outbound210 outbound210 = new Outbound210();
Outbound210Transaction outbound210Trans = new Outbound210Transaction();
outbound210.Transaction = outbound210Trans; 

XmlSerializer xs1 = new XmlSerializer(typeof(Outbound210));
StreamWriter sw1 = new StreamWriter(@"d:\SVN\Demo\Verify.xml");
xs1.Serialize(sw1, outbound210);
sw1.Close();

Интересно, что когда я помещаю пространство имен, а не корень, он сериализуется, а затем отправляется на веб-сервис и обрабатывает его через BizTalk, все в порядке, и там отображается пространство имен в корне (при отслеживании сообщений). Я ожидаю, что я смогу сериализовать тот же файл, что и в BizTalk, с пространством имен в корне, а не со вторым элементом.

...