От новичка до гуру: Курсы программирования на CyberDuff

Почему поле в автоматически сгенерированном классе сериализуется в элемент, если оно определено как атрибут в XSD?

Я пытаюсь представить довольно сложный объект в виде XML через REST API (используя WCF).

Однако объект определяется файлом XSD, поэтому я создал классы с помощью инструмента xsd.exe. Проблема в том, что когда мой объект сериализуется в XML, атрибут (определенный в xsd) сериализуется в элемент. И я не понимаю, почему. В настоящее время я предполагаю, что мой xsd каким-то образом позволяет это, но я не могу сказать, почему. Я не делаю никакой пользовательской сериализации, я позволяю фреймворку справиться с этим.

Может ли кто-нибудь объяснить, почему это происходит и как контролировать такое поведение?

Вот часть из xsd, содержащая элемент и атрибут. Изменить: рассматриваемый атрибут — версия.

<xs:schema xmlns:b="http://some.namespace.com/" xmlns="http://someothernamespace.com/" elementFormDefault="qualified" targetNamespace="http://someothernamespace.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="JobPositionPosting.xsd" />
  <xs:element name="Envelope">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="Sender" />
        <xs:element minOccurs="0" ref="TransactInfo" />
        <xs:element maxOccurs="unbounded" ref="Packet" />
      </xs:sequence>
      <xs:attribute fixed="0.52" name="version" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>

А вот и сгенерированный код.

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "<removed>")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://somenamespace.com", IsNullable = false)]
public partial class Envelope
{

    /// <remarks/>
    public Sender Sender;

    /// <remarks/>
    public TransactInfo TransactInfo;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Packet")]
    public Packet[] Packet;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute("version")]
    public string version;

    public Envelope()
    {
        this.version = "0.52";
    }
}

А вот xml, возвращенный службой REST, то есть сериализованный объект.

<!-- (the rest o the xml is left out on purpose) -->
<Envelope>
    <senderField i:nil="true"/>
    <transactInfoField i:nil="true"/>
    <versionField>0.52</versionField>
</Envelope>

Спасибо!


Ответы:


1

xsd.exe создает классы для использования System.Xml.Serialization.XmlSerializer, в то время как ваш Служба REST использует некоторый вариант System.Runtime.Serialization.DataContractSerializer.

Для DataContractSerializer вместо этого следует использовать svcutil.exe.

svcutil.exe /help
svcutil.exe schema.xsd /dconly
13.07.2012
  • Я попробовал ваше решение, но похоже, что svcutil не может справиться с моим xsd. Какие бы варианты я ни пробовал, он говорит мне, что не может загрузить данные из сборки (что указывает на то, что он не знает, как обрабатывать xsd). Вместо этого я попытался изменить сгенерированные классы, чтобы вместо них можно было использовать XmlSerializer. У меня есть несколько проблем, но я надеюсь решить их очень скоро. 08.08.2012
  • @Anton Кажется, svcutil.exe не поддерживает атрибуты XML, особенно настройку use="required". Только xsd.exe позволяет это. Чтобы использовать XmlSerializer с WCF, вы можете указать XmlSerializerFormat атрибут класса. 08.08.2012
  • Новые материалы

    ИИ меняет этику в руководстве
    Связь искусственного интеллекта, лидерства и этики Сострадание, глубокое понимание чужих страданий в сочетании с желанием облегчить их, возвышается как неотъемлемая человеческая добродетель...

    Представляем Narwhal Technologies (Nrwl)
    6 декабря 2016 г. Маунтин-Вью, Калифорния С тех пор, как Виктор Савкин и я (Джефф Кросс) присоединились к команде Angular в Google на заре Angular 1, Angular продемонстрировал феноменальный..

    Путь AWS  — «Изучение машинного обучения — 10 начинающих ИИ и машинного обучения на AWS».
    Универсальный ресурсный центр для изучения искусственного интеллекта и машинного обучения. НОЛЬ или ГЕРОЙ, начните свое путешествие здесь. Получите решения и пройдите обучение у экспертов AWS...

    5 простых концепций Python, ставших сложными
    #заранее извините 1) Переменные x = 4 y = 5 Переменная в Python — это символическое представление объекта. После присвоения некоторого объекта переменной Python мы приобретаем..

    «Освоение вероятности: изучение совместной, предельной, условной вероятности и теоремы Байеса —…
    Виды вероятности: Совместная вероятность Предельная вероятность Условная вероятность Диаграмма Венна в вероятностях: В “Set Theory” мы создаем диаграмму Венна...

    Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
    Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

    Отслеживание состояния с течением времени с дифференцированием снимков
    Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..