2013-07-04 26 views
1

我想反序列化一個XML到一個類,但它給了我一個例外。當屬性是布爾反序列化錯誤

我的類是類似的東西:

public class FieldsVO 
    {  
     public bool AllowPrint { get; set; } 
     public bool AllowAbort { get; set; } 
     public bool AllowPrintFSFSDA { get; set; } 
    } 

我的XML:

<fields> 
    <AllowPrint>True</AllowPrint> 
    <AllowAbort>True</AllowAbort> 
    <AllowPrintFSFSDA>True</AllowPrintFSFSDA> 
</fields> 

的反序列化工作的唯一方法是,如果屬性是 「字符串」。 有什麼辦法可以用它做什麼?

這裏的反序列化代碼:

public static object Deserialize(string xml, Type objType) 
     { 
      if (false == xml.StartsWith("<")) 
      { 
       int pos = xml.IndexOf('<'); 
       xml = xml.Remove(0, pos); 
      } 
      XmlSerializer serializer = new XmlSerializer(objType); 
      XmlReaderSettings set = new XmlReaderSettings(); 
      set.ValidationFlags = XmlSchemaValidationFlags.AllowXmlAttributes; 
      using (XmlReader reader = XmlReader.Create(new StringReader(xml), set)) 
       return serializer.Deserialize(reader); 
     } 
+4

後的實際(德)序列化代碼的位置。 –

+0

@HenkHolterman剛剛添加了代碼。 – Rafael

+1

感嘆。現在序列化代碼請。他們必須匹配。 XmlSerializer寫入「true」,而不是「True」。 –

回答

2

當你想解析XML,你應該使用XSD架構。

XSD架構描述了一個XML文件。

添加此文件: 創建一個元素 - > XML Schema。 稱此文件爲fields.xsd。

你的情況,這將是:

<xs:element name="fields"> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element name="AllowPrint" type="xs:boolean"/> 
    <xs:element name="AllowAbort" type="xs:boolean"/> 
    <xs:element name="AllowPrintFSFSDA" type="xs:boolean"/> 
    </xs:sequence> 
</xs:complexType> 
</xs:element> 

然後,打開命令行界面。轉到fields.xsd所在的目錄。 輸入:

xsd fields.xsd /classes 

fields.cs現在生成。

在XML文件中,你必須添加: - XSD架構 的命名空間 - XSD架構

 xmlns="urn:fields" 
     xsi:schemaLocation="urn:fields fields.xsd"> 
+0

你並不需要那麼多。 –

+0

@HenkHolterman當您使用自己的XML時,使用XSD Schema是一個非常好的習慣。這是可行的安全。它檢查XML並生成類。必須使用這個強大的工具。 – Gura

+0

它有時必須使用。在使用XmlSerializer時,請注意告訴我XSD在哪些方面會有所幫助? –