.NET xsd средство импорта создает несериализуемый класс

Я использую средство импорта XSD.EXE.NET для генерации классов C# от набора файлов XSD. Когда я пытался сериализировать один из классов к XML, он перестал работать (InvalidOperationException), и когда я вырыл в него, я обнаружил его, один из созданных классов, кажется, является неправильным.

Вот подходящий код XSD:


    
        Indicates in a response message that a request was successfully processed.
    
    
        
    



    
        The processing status of a business message and any related warnings or informational messages.
    



    
        A collection of warnings generated by the successful processing of a business message.
    
    
        
    



    
        Defines details of a warning that occurred during message processing.
    



    
        Defines details of a warning that occurred during message processing.
    
    
        
        
        
        
    

И вот код C#, сгенерированный от него:

public partial class SuccessType
{

    private WarningType[][] warningsField;

    /// 
    [System.Xml.Serialization.XmlArrayItemAttribute("Warning", typeof(WarningType), IsNullable = false)]
    public WarningType[][] Warnings
    {
        get
        {
            return this.warningsField;
        }
        set
        {
            this.warningsField = value;
        }
    }
}

Это сделало Warnings массив массива WarningType. Когда я пытаюсь сериализировать это к XML, я добираюсь InvalidOperationException исключение:

  • Не мог генерировать временный класс (result=1).
  • ошибка CS0030: не Может преобразовать тип 'WarningType []' к 'WarningType'
  • ошибка CS0030: не Может преобразовать тип 'WarningType []' к 'WarningType'
  • ошибка CS0029: не Может неявно преобразовать вводят 'WarningType' к 'WarningType []'
  • ошибка CS0029: не Может неявно преобразовать вводят 'WarningType' к 'WarningType []'

Но если я изменяю сгенерированный код от WarningType[][] кому: WarningType[] затем это сериализирует прекрасный.

За исключением редактирования сгенерированного класса C# каждый раз, когда я повторно создаю это (который, надо надеяться, будет менее часто продвигаться), там какое-либо другое решение? Действительно ли это - ошибка в xsd.exe, или действительно ли файл XSD является неправильным? Возможно, в XmlSerializer существует проблема?

То, что я хочу, является кодом C#, который правильно сериализирует к XML, который проверяет против XSD. Прямо сейчас зубчатый массив, кажется, является неправильным, потому что, если я удаляю его затем, он генерирует XML.

Я использую Visual Studio 2008.

6
задан Jim McKeeth 6 February 2010 в 01:28
поделиться

1 ответ

В инструменте xsd.exe есть ошибки. Я не помню этот конкретный, но я помню, как обнаруживал проблемы с зубчатыми массивами, и, возможно, это остается ошибкой. при желании вы можете использовать инструмент XsdObjbectGen , также от Microsoft, но выпущенный независимо и вне диапазона .NET SDK.

Вы могли бы пойти в обратном направлении: написать код C #, затем сгенерировать схему с помощью xsd.exe и посмотреть, что изменилось. Возможно, xsd.exe хочет, чтобы схема выглядела определенным образом, чтобы правильно сгенерировать правильный код для неровных массивов.


На самом деле, перечитав свой вопрос, вы никогда не сказали того, чего действительно хотели. Вы хотите, чтобы SuccessType содержал массив массивов или нет?

И это WarningsType или WarningType ? Есть некоторые разногласия между предоставленными вами фрагментами кода.


Предполагая, что вам нужен массив массивов, я написал этот код C #:

public class WarningType
{
    public String oof;
}


public partial class SuccessType
{
    private WarningType[][] warningsField;

    /// <remarks/>
    [System.Xml.Serialization.XmlArrayItemAttribute("Warning", typeof(WarningType[]), IsNullable = false)]
    public WarningType[][] Warnings
    {
        get
        {
            return this.warningsField;
        }
        set
        {
            this.warningsField = value;
        }
    }
}

... затем скомпилировал его в DLL. Затем я запустил xsd.exe в этой DLL и сгенерировал этот XSD:

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="WarningType" nillable="true" type="WarningType" />
  <xs:complexType name="WarningType">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="oof" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
  <xs:element name="SuccessType" nillable="true" type="SuccessType" />
  <xs:complexType name="SuccessType">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="Warnings" type="ArrayOfArrayOfWarningType" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ArrayOfArrayOfWarningType">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="Warning" type="ArrayOfWarningType" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ArrayOfWarningType">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="WarningType" nillable="true" type="WarningType" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>

... и он выполняет циклическую обработку. Если затем запустить xsd.exe в этой схеме, я получу тип, который обертывает массив массивов.

4
ответ дан 17 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: