XSD generierte Klasse mit minOccurs="0" und Default Werten
Mir ist bei einem Fehler aufgefallen, dass XSD.exe zusammen mit dem XmlSerializer so seine Tücken hat.
Ich weiß, dass XSD.exe nicht das gelbe vom Ei ist, weshalb ich hier nicht auf Alternativen eingehe.
Problembeschreibung:Eine Klasse, die mittels XSD.exe aus einem Schema heraus generiert werden soll. Das Schema sieht z.B. so aus:
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="http://tempuri.org/TestObject.xsd" elementFormDefault="qualified" targetNamespace="http://tempuri.org/TestObject.xsd" id="TestObject" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="TestObject">
<xs:complexType>
<xs:sequence>
<xs:element name="TestStringField" type="xs:string" />
<xs:element default="-1" minOccurs="0" name="TestIntegerField" type="xs:integer" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Wichtig ist, dass
TestIntegerField "minOccurs" und einen "default" besitzt!
Die Klasse, die mittels XSD.exe generiert wird sieht dann so aus:
using System.Xml.Serialization;
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/TestObject.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/TestObject.xsd", IsNullable=false)]
public partial class TestObject {
private string testStringFieldField;
private string testIntegerFieldField;
public TestObject() {
this.testIntegerFieldField = "-1";
}
/// <remarks/>
public string TestStringField {
get {
return this.testStringFieldField;
}
set {
this.testStringFieldField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(DataType="integer")]
[System.ComponentModel.DefaultValueAttribute("-1")]
public string TestIntegerField {
get {
return this.testIntegerFieldField;
}
set {
this.testIntegerFieldField = value;
}
}
}Problem ist, wenn man die Default Werte unangetastet lässt, dass beim Serialisieren mittels dem XmlSerializer diese Xml Knoten nicht mitserialisert werden.
Lösung:Es gibt hierfür auch bei Microsoft einen
Support Beitrag, wo erklärt wird, dass das "By Design" ist.
Es bleibt einem nur übrig, alle Attribute
[System.ComponentModel.DefaultValueAttribute("-1")] im generierten Code nachträglich zu entfernen.
Keine glückliche Lösung, aber es ist immerhin eine.