использование XSD.exe для генерации XSD - PullRequest
0 голосов
/ 02 февраля 2010

Я строю кубы SSAS, используя AMO в c # . Для этого я хочу получить список общедоступных свойств для классов Server, Cube, Dimension и т. Д. Это будет мой надмножество, из которого пользователь должен предоставить обязательные свойства и может предоставить необязательные.

Я пытаюсь сгенерировать схему XSD. Я выполнил следующую команду

XSD C:\windows\assembly\GAC_MSIL\Microsoft.AnalysisServices\10.0.0.0__89845dcd8080cc91\Microsoft.AnalysisServices.DLL /dataset /element:Cube /out:c:\temp\gac

и получил эту ошибку

Error: There was an error processing 'C:\windows\assembly\GAC_MSIL\Microsoft.AnalysisServices\10.0.0.0__89845dcd8080cc91\Microsoft.AnalysisServices.DLL'.
  - There was an error reflecting type 'Microsoft.AnalysisServices.ModelComponent'.
  - Cannot serialize member 'System.ComponentModel.Component.Site' of type 'System.ComponentModel.ISite', see inner exception for more details.
  - Cannot serialize member System.ComponentModel.Component.Site of type System.ComponentModel.ISite because it is an interface.

Что мне сделать, чтобы схема была сгенерирована правильно?

Ответы [ 2 ]

2 голосов
/ 17 июля 2014

Решение состоит в том, чтобы дать XSD.exe команду пропустить сериализацию вашего проблемного члена (в вашем случае «System.ComponentModel.Component.Site»). Для этого добавьте следующий атрибут перед членом класса, который создает проблему:

[System.Xml.Serialization.XmlIgnore]
1 голос
/ 15 февраля 2010

При чтении этого вопроса я удивился нескольким вещам:

  • Почему есть опция / набор данных. Это полезно только при преобразовании XSD в код. Вы, кажется, делаете (скомпилированный) код в XSD. (набор данных в сравнении с генерацией класса DTOc)
  • Почему есть опция / element. Это полезно только при преобразовании XSD в код (Sub выбирает элемент (ы), для которого создается код, а не все элементы в исходной схеме)

Тогда проблема возникает в том, что эта библиотека содержит типы, имеющие открытые поля / свойства с типом интерфейса (в данном случае ISite).

XmlSerializer не может сериализовать интерфейсы, ему нужны конкретные типы. Отсюда и неудача, которую вы получаете.

Цель ясна, но, боюсь, вы не сможете использовать инструмент XSD.exe. Поскольку один из ваших обязательных объектов (Cube) имеет открытое свойство типа ISite, это всегда будет нарушать XMLSerializer.

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

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

...