Svcutil在DataContractAttribute中生成错误的Name属性值

时间:2011-11-23 09:15:07

标签: c# xsd datacontractserializer wcf-rest svcutil.exe

当我使用svcutil.exe从xsd文件中包含的定义生成Customer类时:

<xs:schema ...>

<xs:element name="customer" type="Customer" nillable="true" />

<xs:complexType name="Customer">
  <xs:sequence>
    <xs:element name="id" type="xs:decimal" minOccurs="0" />
    <xs:element name="first_name" type="xs:string" />
    <xs:element name="last_name" type="xs:string" />
    <xs:element name="phone" type="Phone" minOccurs="0" />
    <xs:element name="email" type="Email" minOccurs="0" />
    <xs:element name="personal_id" type="xs:string" minOccurs="0" />
    <xs:element name="address" type="Address" minOccurs="0" />
    <xs:element name="status" type="CustomerStatus" />
  </xs:sequence>
</xs:complexType>

</xs:schema>

我得到了以下类的定义:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="Customer", Namespace="http://www.bluewhite.pl/api/1.0")]
public partial class Customer : object, System.Runtime.Serialization.IExtensibleDataObject
{

DataContractAttribute的Name属性具有无效值:“Customer”(以大写字母开头),因为根据xs:element的name属性,它应该是:“customer”(以小写字母开头)。

我按如下方式启动svcutil.exe:

svcutil.exe" *.xsd /t:code /dconly /n:*,Esap.AdtZapisoMessages /o:Messages.cs /tcv:Version35

生成的xml必须包含名为“customer”的根元素,我问你,为什么svcutil.exe会出现此错误。

1 个答案:

答案 0 :(得分:4)

svcutil在那里是完全正确的; 类型的名称为Customer。从:

<xs:complexType name="Customer">

小写customer是作为根元素使用的上下文,但是,它更像是xsd / SOAP事物,并且不单独与合同类型相关。请注意,svcutil对合同类型感兴趣;它是xsd.exe的不同工具。

如果你想匹配一个特定的xml布局,svcutil就是错误的工具;这是xsd.exe的工作。我希望xsd.exe会输出所需的[XmlRoot("customer")]

我测试了它,果然:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlRootAttribute("customer", Namespace="",
          IsNullable=true)]
public partial class Customer {