Невозможно создать временный класс (результат = 1). ошибка CS0030: не удается преобразовать тип «Тип []» в «Тип»?

Я получаю эту ошибку после того, как создал класс из моего файла xsd с помощью инструмента xsd.exe. Я поискал в сети и нашел решение. Вот ссылка: http://satov.blogspot.com/2006/12/xsdexe-generated-classes-causing.html

Проблема в том, что это приводит к запуску кода, но каким-то образом десериализованные данные кажутся поврежденными. Я сделал то, что предлагает сайт, и в итоге второе измерение массива всегда пусто (см. Комментарии к сайту, у кого-то тоже была эта проблема). Вопрос в том, как мне решить эту проблему сейчас? Есть ли другой инструмент для создания файла xsd? Я безуспешно пробовал Xsd2Code.

Спасибо :-)


person grady    schedule 13.07.2011    source источник
comment
Вы видели обсуждение здесь: social.msdn.microsoft.com/forums/en-US/asmxandxml/thread/ кажется, что вы можете добавить фиктивный атрибут в свой xsd. Не уверен, что это проблема, с которой вы столкнулись.   -  person tom redfern    schedule 13.07.2011
comment
У меня аналогичная проблема, но добавление фиктивного атрибута не помогло, см. Мой вопрос здесь: stackoverflow.com/q/10514817 / 198048   -  person Mr Shoubs    schedule 09.05.2012
comment
Это устарело, ссылка на блог заблокирована ..   -  person Ryan Dooley    schedule 17.04.2018


Ответы (8)


Вам необходимо изменить тип переменной-члена в сериализованном классе. Например, если возникает такая ошибка, как:

Невозможно создать временный класс (результат = 1). ошибка CS0030: не удается преобразовать тип «Данные []» в «Данные».

Я выполнил поиск по имени типа данных в сгенерированном файле и нашел следующее:

[System.Xml.Serialization.XmlArrayItemAttribute("Data", typeof(Data), IsNullable=false)]
public Data[][] Row

Заменить Data[][] на Data[] - измените тип данных с двумерного массива на одномерный. Это решило бы вашу проблему. :)

person Ajax    schedule 17.10.2012
comment
Спасибо за подсказку. Но почему Microsoft XSD Tool генерирует 2D-массивы? - person float; 11.06.2013
comment
У меня была такая же проблема при использовании Microsoft XSD для создания класса для XML, возвращаемого API биржевого брокера TD Ameritrade. Интересно, есть ли инструменты лучше, чем XSD.EXE, которые автоматически генерируются без необходимости вручную очищать класс C # ? Я получаю слишком много ошибок в одном XML, и мне нужно обработать еще много ...! - person Code Monkey; 27.07.2013
comment
Когда я столкнулся с этой проблемой, я восстановил схему с помощью xsd2Code, и это устранило проблему. - person blachniet; 27.06.2014
comment
Почему это еще не было исправлено, та же проблема возникла через 2 года - person Coops; 12.01.2015
comment
Я столкнулся с такой же ошибкой при сериализации экземпляра сгенерированного типа XSD.EXE, и ошибка исправлена ​​после изменения 2D-массива на 1D-массив в сгенерированном XSD.EXE классе Спасибо. - person yantaq; 27.10.2015
comment
Та же проблема. Это исправило это. Спасибо. - person Eric; 30.01.2016
comment
И снова в 2018 - person Piero Alberto; 10.09.2018
comment
Нет ... все еще проблема ... если FedEx не использует одно и то же в течение ГОД ... это просто спасло жизнь, так как я сходил с ума - person Simon Price; 06.12.2018
comment
Все еще не исправлено - я только что сгенерировал новый файл класса из XSD и, к счастью, SO спас меня (как обычно), потому что это действительно сбивало с толку. - person Scott Salyer; 27.08.2019
comment
Несмотря на то, что представленное здесь решение предотвращает создание исключения, в моем случае оно не обязательно решает проблему. Он не учитывает некоторые данные из XML, которые я пытаюсь проанализировать. В частности, преобразование из 2d в 1d приводит к поднятию только первого предмета. - person joe_maya; 29.08.2019
comment
И снова в 2020 году. Спасибо! - person Nicolás Abram; 12.03.2020

Была та же проблема, но Xsd2Code не интегрировался с VS2012. Поэтому вместо этого я перешел к моему сгенерированному xsd.exe файлу .cs и сделал:

Найдите [] [] Замените []

который работал.

person classicskids    schedule 09.12.2014

Я получил эту ошибку. В вашем решении есть файл reference.cs в этом файле, вам нужно найти "[] []", и тогда в нем будет два результата ..

После того, как вам нужно удалить один «[]» из «[] []» с обоих мест ..

Меня устраивает..

Спасибо..

person shaishav shukla    schedule 10.05.2016
comment
Из всех ответов это тот, который работает на меня. Кажется, Visual Studio, когда вы добавляете ссылку на сервис, совершает именно эту ошибку. - person nivs1978; 05.05.2017

Добавьте <xs:attribute name="tmp" type="xs:string" /> после каждого элемента
<xs:sequence maxOccurs="unbounded"> <xs:element ../> </xs:sequence>
и
<xs:sequence> <xs:element maxOccurs="unbounded"/> </xs:sequence>
в файле схемы , если вы не хотите терять размерность массива .

person Waldemar Gałęzinowski    schedule 09.03.2016
comment
Не могли бы вы привести пример этого? - person Najera; 25.11.2016

Мне это помогает исправить XML, используемый для генерации кода. Бывает, когда:

<Names>
    <Name></Name>
    <Name></Name>
</Names>

тогда это оптимизируется xsd для двойной записи имени массива

Что я сделал:

<Names>
    <Dummy></Dummy>
    <Name></Name>
    <Name></Name>
</Names>

xsd не оптимизирует его, но оставляет одно имя массива

person Leendert Nelemans    schedule 07.04.2017

Если он находится в VB.net, вам нужно найти () () в своем Reference.vb и заменить на ()

person JB9    schedule 01.03.2016

В моем случае проблема возникает из-за недопустимого объявления атрибута свойства XmlArrayItem.

От

[XmlArrayItem("MyArray", typeof(string))]
public List<ClassName> Items{ get; set; }

Я изменил соответствующий тип: со строки на ClassName

[XmlArrayItem("MyArray", typeof(ClassName))]
public List<ClassName> Items{ get; set; }

Надеюсь это поможет!

person Ashraf Alam    schedule 23.06.2015

Это действительно ответ @ WaldemarGałęzinowski, https://stackoverflow.com/a/35896991/157224 немного расширился.

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

Родитель-Дочерний

Оптимизация позволит избежать создания специального типа для родительского элемента и вместо этого сделает его массивом дочерних элементов.

ChildType[] Parent { get; set; } вместо ParentType Parent { get; set; }, и вы получаете доступ к дочерним элементам как Parent[0] вместо Parent.Child[0]. (Иногда я нахожу эту оптимизацию немного запутанной)

Здесь происходит еще один уровень неограниченного элемента без атрибутов.

Родитель-ребенок-внук

Оптимизация применяется дважды, в результате получается GrandChildType[][] Parent {get; set;}, и вы получаете доступ к своему любимому первому внуку, например, Parent[0][0] вместо Parent.Child[0].GrandChild[0].

Проблема в том, что сериализатор .Net не поддерживает массивы массивов и генерирует недопустимый код.

Я понятия не имею, почему Microsoft не исправляла эту ошибку все эти годы, но решение простое.

Просто заставьте xsd.exe сгенерировать класс для родителя или потомка, добавив в последовательность необязательный атрибут или необязательный элемент. например обходной путь

Что приводит к Parent[0].GrandChild[0]

person adrianm    schedule 04.02.2021