Я столкнулся с довольно большой проблемой, порождающей классы C# из нескольких XSD. Во время сериализации член Enum get имеет неправильное значение. Свойство отсутствует в XML-сериализации, поэтому я ожидаю, что оно будет NULL или «0», но вместо этого оно получает значение «1», которое является первым доступным значением в Enum.XSD2Code без генерации необязательный Enum
Предположим, у меня есть XSD, называемый «person.xsd», и он выглядит так:
person.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema>
<xs:import namespace="http://www.somewhere.nl/folder1/1_1/basisschema/schema/1" schemaLocation="basisschema.xsd"/>
<xs:complexType name="Person">
<xs:annotation>
<xs:documentation>Personal information</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="SomeType" type="ns:CDT_SomeType" minOccurs="0">
<xs:annotation>
<xs:documentation>Some type.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
Человек XSD включает в себя базовую схему под названием 'basisschema.xsd'. Этот файл выглядит так:
basisschema.xsd
<xs:schema targetNamespace="http://www.somewhere.nl/folder1/1_1/basisschema/schema/1" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns="http://www.somewhere.nl/folder1/1_1/basisschema/schema/1">
<xs:complexType name="CDT_SomeType">
<xs:annotation>
<xs:documentation>Some type.</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="SomeEnumElement" type="ns:LDT_SomeEnumElement">
<xs:annotation>
<xs:documentation>Some enum</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
Сгенерированный код выглядит следующим образом;
Client.cs
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.81.0")]
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.somewhere.nl/folder1/1_1/basisschema/schema/1")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.somewhere.nl/folder1/1_1/basisschema/schema/1", IsNullable = true)]
public class Client
{
private CdtSomeType _someType;
public Client()
{
_someType = new CdtSomeType();
}
public CdtSomeType SomeType
{
get
{
return _someType;
}
set
{
_someType = value;
}
}
}
CdtSomeType.cs
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.81.0")]
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.somewhere.nl/folder1/1_1/basisschema/schema/1")]
public class CdtSomeType
{
private LDTSomeEnumElement _someEnumElement;
public LDTSomeEnumElement SomeEnumElement
{
get
{
return _verklaringField;
}
set
{
_verklaringField = value;
}
}
}
Я ожидал, что дополнительное свойство типа 'CdtSomeType' в Person.cs, однако этого не произошло , Теперь, когда мы сериализуем XML-файл, соответствующий этому XSD, используя следующий фрагмент кода;
using (var reader = new StringReader(message))
{
var myXmlObject = (Person)serializer.Deserialize(reader);
//This value isn't available in the XML so I want this to be NULL instead of the default Enum value.
var test = myXmlObject.SomeType.SomeEnumElement;
}
Тогда свойство 'SomeEnumElement' имеет значение по умолчанию перечисление (1) вместо NULL или '0'. Это происходит во время сериализации. Что я могу сделать, чтобы решить эту проблему?