2014-12-19 3 views
0

Мне нужно десериализовать необработанный xml для определенного объекта. Однако у меня возникают проблемы, когда речь идет о логических и перечисляемых типах, поскольку чувствительность к регистру не повреждена.DataContractSerializer Чувствительность к регистру

public MyObjectTypeDeserializeMethod(string rawXML) 
{ 
    DataContractSerializer serializer = new DataContractSerializer(typeof(MyObjectType)); 
    MyObjectType tempMyObject = null; 

    try 
    { 
     // Use Memory Stream 
     using (MemoryStream memoryStream = new MemoryStream()) 
     { 
      // Use Stream Writer 
      using (StreamWriter streamWriter = new StreamWriter(memoryStream)) 
      { 
       // Write and Flush 
       streamWriter.Write(rawXML); 
       streamWriter.Flush(); 

       // Read 
       memoryStream.Position = 0; 
       tempMyObject = (MyObjectType)serializer.ReadObject(memoryStream); 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     throw e; 
    } 

    return tempMyObject; 
} 

public class MyObjectType 
{ 
    public bool boolValue {get; set;} 
    public MyEnumType enumValue {get; set;} 
} 

Если исходный XML содержит

<boolValue>true</boolValue> 

он работает отлично. Однако он вызывает исключение, когда значение отличается от предыдущего, такие как

<boolValue>True</boolValue> 

Как этот вопрос решается, с тем чтобы нечувствительны к регистру булевы и перечислений значения, которые передаются из исходного XML?

+0

Препроцессирование XML должен решить проблему. – Sinatr

+0

Что вы подразумеваете под предварительной обработкой? – JEPAAB

+0

Конвертировать 'True' в' true' любым способом. – Sinatr

ответ

1

xml specificationопределяет XML, чтобы быть чувствительны к регистру, и определяет булевы быть (примечание случай) литералов true и false. DataContractSerializer делает все правильно. Если значение равно True, то это не xml boolean, и его следует рассматривать как string.

+0

Есть ли возможное обходное решение? – JEPAAB

+0

Да - исправить отправку программного обеспечения - он сломан. –

1

Существует много способов решить эту проблему. Простой способ такой подход:

public class MyObjectType 
{ 
    [XmlIgnore] public bool BoolValue; // this is not mapping directly from the xml 

    [XmlElement("boolValue")] 
    public string BoolInternalValue // this is mapping directly from the xml and assign the value to the BoolValue property 
    { 
     get { return BoolValue.ToString(); } 
     set 
     { 
      bool.TryParse(value, out BoolValue); 
     } 
    } 
    ... 

и я использую XmlSerializer для десериализации XML:

public static T Deserialize<T>(string xmlContent) 
    { 
     T result; 
     var xmlSerializer = new XmlSerializer(typeof(T)); 
     using (TextReader textReader = new StringReader(xmlContent)) 
     { 
      result = ((T)xmlSerializer.Deserialize(textReader)); 
     } 
     return result; 
    } 
+0

Использование XML-сериализатора не является хорошей альтернативой использованию Serializer Data Contract Serializer. Он гораздо более ограничен, медленнее и почти не поддерживается. –

+0

@JohnSaunders Я никогда не говорю, что XmlSerializer лучше, чем DataContractSerializer, я просто предлагаю решение. –

+0

Первый блок кода был очень полезен для обработки некоторых перечислений с помощью Mongo. Мне не нужно было писать какой-либо десериализационный код, поэтому я не уверен, насколько это необходимо или даже насколько ценным является второй блок кода. – Ellesedil

Смежные вопросы