2010-02-02 7 views
0

Je construis des cubes SSAS en utilisant AMO in c#. Pour cela, je veux obtenir une liste des propriétés publiques pour les classes pour Server, Cube, Dimension, etc. Ce sera mon sur-ensemble à partir duquel l'utilisateur doit fournir des propriétés obligatoires et peut fournir celles facultatives. J'essaie de générer un schéma XSD. J'ai couru la commande suivanteen utilisant XSD.exe pour générer un XSD

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

et obtenu cette erreur

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. 

Que dois-je faire pour que le schéma est correctement généré?

Répondre

1

Il y a quelques choses je me suis demandé lors de la lecture de cette question:

  • Pourquoi une option/jeu de données. Ceci n'est utile que lors de la transformation d'un XSD en code. Vous semblez faire le code (compilé) dans XSD. (jeu de données par rapport à la génération de classes DTOc)
  • Pourquoi avoir une option/element. Ce n'est utile lors de la transformation d'un XSD en code (Sous sélectionnez l'élément (s) pour générer du code pour, tous les éléments du schéma source)

Alors, pourquoi le problème se produit est que cette bibliothèque contient des types, qui ont des champs/propriétés publics avec un type d'interface (ISite dans ce cas).

XmlSerializer ne peut pas sérialiser les interfaces, il a besoin de types concrets. D'où l'échec que vous obtenez.

L'objectif est clair, mais je crains que vous ne serez pas en mesure d'utiliser l'outil XSD.exe. Puisque l'un de vos objets requis (Cube) a une propriété publique du type ISite, ceci va toujours rompre le XMLSerializer. Je suppose que votre meilleur pari est le SDK AnalysisServices (peut-être qu'ils vous fournissent ce modèle d'objet) ou ... (ouch) en utilisant vous-même la réflexion sur les types que vous voulez générer avec un sous-ensemble des propriétés-champs en laissant de côté n'importe quel type d'interface.

Hope this helps,

+0

question sous la direction d'ajouter but –

+0

Ce serait bien si XSD.exe pourrait au moins créer un type abstrait qui représente les propriétés iSite; mieux encore s'il pouvait analyser toutes les classes concrètes qui implémentent ISite dans les assemblys fournis et les utiliser pour générer des types XSD concrets qui étendent le type de base ISite. Peut-être que quelqu'un avec plus de temps libre pourrait écrire une telle chose ... :-) –

2

La solution est d'instruire XSD.exe de sauter sérialisation de votre membre problématique («de System.ComponentModel.Component.Site dans votre cas). Pour cela, ajoutez l'attribut suivant avant que le membre de la classe qui fait le problème:

[System.Xml.Serialization.XmlIgnore] 
Questions connexes