2010-02-02 67 views
0

我正在使用AMO in c#构建SSAS多维数据集。为此,我想获取服务器,多维数据集,维度等的类的公共属性列表。这将是我的超集,用户必须从中提供强制属性,并可以提供可选属性。使用XSD.exe生成XSD

我想生成一个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. 

我该怎么做,以便正确生成的架构?

回答

1

有几件事情我想知道读了这个问题时:

  • 为什么有/数据集的选项。在将XSD转换为代码时,这只是有用的。你似乎正在(编译)代码到XSD中。 (数据集与DTOc类的生成)
  • 为什么要有/元素选项。转化的XSD成代码时,这是唯一有用的(子选择元件(一个或多个),以生成用于在源模式不是所有的元素代码)

那么,为什么会出现问题是,这个库包含的类型,其中具有公共字段/属性的接口类型(在这种情况下是ISite)。

XmlSerializer无法序列化接口,它需要具体的类型。因此你失败了。

目标很明确,但恐怕您将无法使用XSD.exe工具。由于您的一个必需对象(Cube)具有ISite类型的公共属性,因此这将始终会破坏XMLSerializer。

我猜你最好的选择是AnalysisServices SDK(也许他们提供了这个对象模型)或...(哎哟)使用反射自己想要的属性字段的一个子集生成的类型任何接口类型。

希望这有助于

+0

问题编辑追加目标 – 2010-02-16 15:08:39

+0

这将是很好,如果XSD.EXE至少可以创建一个代表的ISite性质的抽象类型;如果能够分析在提供的程序集中实现ISite的所有具体类并使用它们生成扩展了ISite基本类型的具体XSD类型,那么更好。也许有更多空闲时间的人可以写这样的东西...... :-) – 2011-12-21 21:24:49

2

解决方案是指导XSD.EXE跳过你的问题的成员(在你的情况“System.ComponentModel.Component.Site”)的序列化。 要做到这一点添加类的成员,使该问题之前,以下属性:

[System.Xml.Serialization.XmlIgnore]