【问题标题】:using XSD.exe to generate an XSD使用 XSD.exe 生成 XSD
【发布时间】:2010-02-02 15:26:03
【问题描述】:

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

我正在尝试生成 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.

我该怎么做才能正确生成架构?

【问题讨论】:

    标签: c# xml xsd xsd.exe


    【解决方案1】:

    解决方案是指示 XSD.exe 跳过有问题的成员的序列化(在您的情况下为“System.ComponentModel.Component.Site”)。 为此,请在产生问题的类成员之前添加以下属性:

    [System.Xml.Serialization.XmlIgnore]
    

    【讨论】:

      【解决方案2】:

      在阅读这个问题时,我想知道一些事情:

      • 为什么要有 /dataset 选项。这仅在将 XSD 转换为代码时有用。您似乎正在将(编译的)代码放入 XSD。 (数据集与 DTOc 类生成)
      • 为什么要有 /element 选项。这仅在将 XSD 转换为代码时有用(子选择要为其生成代码的元素,而不是源架构中的所有元素)

      那么,问题出现的原因是该库包含类型,这些类型具有接口类型的公共字段/属性(本例中为 ISite)。

      XmlSerializer 不能序列化接口,它需要具体的类型。因此你得到了失败。

      目标很明确,但恐怕您将无法使用 XSD.exe 工具。由于您需要的对象之一(多维数据集)具有 ISite 类型的公共属性,因此这总是会破坏 XMLSerializer。

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

      希望这会有所帮助,

      【讨论】:

      • 如果XSD.exe 至少可以创建一个代表ISite 属性的抽象类型就好了;如果它可以分析在提供的程序集中实现 ISite 的所有具体类,并使用这些类生成扩展 ISite 基类型的具体 XSD 类型,那就更好了。也许有更多空闲时间的人可以写这样的东西...... :-)
      猜你喜欢
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 2011-01-14
      • 2012-10-28
      • 2011-03-15
      相关资源
      最近更新 更多