2015-11-27 2 views
0

Я столкнулся с довольно большой проблемой, порождающей классы 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'. Это происходит во время сериализации. Что я могу сделать, чтобы решить эту проблему?

ответ

0

Проблема заключается в том, что ваше свойство enum не равно NULL в xsd. Поэтому он не может возвращать null или 0 (0 также может быть первым элементом в перечислении) без изменения структуры xsd. XSD2Code также должен генерировать свойство, которое сообщает вам, существует ли этот элемент перечисления в родительском элементе.

Что-то вроде этого

[System.Xml.Serialization.XmlIgnoreAttribute()] 
public bool LDTSomeEnumElementSpecified 
    { 
     get 
     { 
      return _verklaringField; 
     } 
     set 
     { 
      _verklaringField = value; 
     } 
    } 

На основе этого свойства (Будьте осторожны, он должен иметь [System.Xml.Serialization.XmlIgnoreAttribute()] атрибут), вы можете справиться с этим в коде, например, таким образом.

string tmp = deserializedObject.LDTSomeEnumElementSpecified ? deserializedObject.LDTSomeEnumElement.ToString() : String.Empty; 
Смежные вопросы