2014-12-19 174 views
0

我需要將一個raw 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 2014-12-19 10:31:21

+0

預處理是什麼意思? – JEPAAB 2014-12-19 10:32:24

+0

以任何方式將'True'轉換爲'true'。 – Sinatr 2014-12-19 10:35:24

回答

1

xml specification限定 XML是大小寫敏感的,並且限定布爾是(注意情況)文字truefalseDataContractSerializer做得對。如果值爲True,那麼它不是一個xml布爾型,應該被視爲string

+0

有沒有可能的解決方法? – JEPAAB 2014-12-19 10:31:59

+0

是 - 修復發送軟件 - 已損壞。 – 2014-12-19 18:00:29

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序列化程序不是使用數據協定序列化程序的好選擇。它更受限制,速度更慢,幾乎不受支持。 – 2014-12-19 17:59:53

+0

@JohnSaunders我從來沒有說過XmlSerializer比DataContractSerializer更好,我只是提出了一個解決方案。 – 2014-12-19 19:49:22

+0

第一個代碼塊對於用Mongo處理一些枚舉非常有用。我不需要編寫任何反序列化特定的代碼,所以我不確定第二個代碼塊有多麼必要,甚至是多麼有價值。 – Ellesedil 2015-11-19 22:58:30