2013-01-10 91 views
2

我有一個包含模板(默認值)和指定字段的非標準XML。作爲一個例子總是歡迎:Xml反序列化和默認值

<MyClass> 
    <ArrayOfSubClass> 
     <SubClass> 
     <Par1>1</Par1> 
     <Par2>2</Par2> 
     <Par3>3</Par3> 
     <ArrayOfSpecific> 
      <Specific> 
       <Par1>11</Par1> 
      </Specific> 
     </ArrayOfSpecific> 
     </SubClass> 
    </ArrayOfSubClass> 
</MyClass> 

我想這個類MyClass反序列化爲一個對象。如您所見,MyClass是​​類的集合,它有三個參數和一個類Specific的集合。類​​和Specific是從相同的母類派生的。

什麼是特定的我想找到默認值(即在​​找到的值),除非給出一個字段。我到目前爲止所做的是實現一種方法,通過反射檢查類Specific的屬性是否具有屬性類型的默認值,如果屬實,則將其替換爲​​的屬性。它工作得很好,但我沒有涵蓋所有的情況。例如,想象一下​​中的雙重屬性Par1的值,例如Par1 = 1.234,但我希望它現在爲0。問題是0是double類型的默認值,所以在我的方法中,我將檢索​​中的屬性值。

最好將已先反序列化MyClass對象,然後把類Specific所有屬性具有相同屬性的​​的值,然後再反序列化到這個現有的對象,只改變了在給定的屬性XML文件。

這是相當棘手所以,我可以想像,我的問題是不容易理解......

[編輯:]爲了嘗試更加理解,這是我想要的結果,一旦反序列化

<MyClass> 
    <ArrayOfSubClass> 
     <SubClass> 
     <Par1>1</Par1> 
     <Par2>2</Par2> 
     <Par3>3</Par3> 
     <ArrayOfSpecific> 
      <Specific> 
       <Par1>11</Par1> 
       <Par2>2</Par2> 
       <Par3>3</Par3> 
      </Specific> 
     </ArrayOfSpecific> 
     </SubClass> 
    </ArrayOfSubClass> 
</MyClass> 

它是由反射反序列化之後進行,如果Specific的屬性都有一個默認值,然後走班​​的價值。棘手的案件是遵循

<MyClass> 
    <ArrayOfSubClass> 
     <SubClass> 
     <Par1>1</Par1> 
     <Par2>2</Par2> 
     <Par3>3</Par3> 
     <ArrayOfSpecific> 
      <Specific> 
       <Par1>0</Par1> <----- 0 is the default value of a double 
      </Specific> 
     </ArrayOfSpecific> 
     </SubClass> 
    </ArrayOfSubClass> 
</MyClass> 

目前的結果將是

<MyClass> 
    <ArrayOfSubClass> 
     <SubClass> 
     <Par1>1</Par1> 
     <Par2>2</Par2> 
     <Par3>3</Par3> 
     <ArrayOfSpecific> 
      <Specific> 
       <Par1>1</Par1> <---- as 0 is the default value of a double, this property is set to the value of the SubClass 
       <Par2>2</Par2> 
       <Par3>3</Par3> 
      </Specific> 
     </ArrayOfSpecific> 
     </SubClass> 
    </ArrayOfSubClass> 
</MyClass> 

,但我想

<MyClass> 
    <ArrayOfSubClass> 
     <SubClass> 
     <Par1>1</Par1> 
     <Par2>2</Par2> 
     <Par3>3</Par3> 
     <ArrayOfSpecific> 
      <Specific> 
       <Par1>0</Par1> 
       <Par2>2</Par2> 
       <Par3>3</Par3> 
      </Specific> 
     </ArrayOfSpecific> 
     </SubClass> 
    </ArrayOfSubClass> 
</MyClass> 
+0

我得到了那句話失去了:@「問題是,0是double類型的默認值,所以用我的方法,我將檢索子類中的屬性的值。 「 ,你是什麼意思,爲什麼這是一個問題?如果你只是將這個值設置爲零會發生什麼? –

+0

你在做什麼語言?這篇文章的標籤是「c」,但由於你提到的是類和反射,我猜這是別的。 – JLRishe

+0

這是在c#對不起... – GuillaumeA

回答

0

好的,我找到了解決方法,解決了我的問題。我在兩步(實際上是三步)做這件事。首先,我將XML反序列化到我的類中。其次,我將Specific類的所有屬性都設置爲默認值,我在​​中通過反射找到了默認值,期望一個字段(Specific類的If)。第三,我將XML重新加載到DataSet。在那裏,我看看名爲SpecificDataTable,並且對於我的類的所有屬性,我查看是否存在具有相同名稱的任何列,並且如果該單元格包含值,則將其放入我的類中。

Ouffffff !!!! 不是真的很美,但它有效。

 DataSet xmlDS = new DataSet(); 
    xmlDS.ReadXml(filename); 
    GetSpecifiedValuesInDataSet(xmlDS); 

    DataTable table = xmlDS.Tables["Specific"]; 

    foreach(ArrayOfSubClass array in this.Items) 
    { 
     foreach(SubClass sub in array) 
     { 
      foreach(Specific specific in sub) 
      { 
       Type specificType = specific.GetType(); 

       DataRow modelRow = null; 
       foreach(DataRow row in table.Rows) 
       { 
       if(row["Par1"].ToString().Equals(specific.Par1.ToString())) 
       { 
        modelRow = row; 
        break; 
       } 
       } 

       if(modelRow != null) 
       { 
       foreach(PropertyInfo propSpecific in specificType.GetProperties()) 
       { 
        string propertyName = propSpecific .Name; 
        foreach(DataColumn col in table.Columns) 
        { 
         if(col.ColumnName.Equals(propertyName)) 
         { 
          if(!string.IsNullOrEmpty(modelRow[propertyName].ToString())) 
          { 
          object value = Convert.ChangeType(modelRow[propertyName], propSpecific.PropertyType); 
          propSpecific.SetValue(modelProd, value, null); 
          } 
         } 
        } 
       } 
       } 
      } 
     } 
    } 

0

下面是序列化,可能是有益的CodeProject上的鏈接的集合:

雖然我不能肯定我明白你的問題,你能不能讓你的類序列化,並在myClass例如,代碼序列化的適當的值?

+0

我知道我的問題不清楚,但這是我能做的最好的:-(所有的類都是可序列化的 – GuillaumeA

+0

你能解釋你的類的層次結構嗎?你說SubClass和Specific都繼承了相同的基類。是否更可行的實現一個接口呢? – Tebc

+0

我不知道我理解爲什麼一個接口會更好?基類只是一個容器的各種屬性。目前,我將嘗試的解決方案是一次反序列化,將類「SubClass」的所有值放入「Specific」類中,然後解析XML文件以查看該屬性是否存在於XML中,以及是否存在用文件中給出的值覆蓋它的值。 – GuillaumeA