2010-09-14 64 views
1

的問題兒童XML元素是不是反序列化

我有一個問題,當我反序列化我的XML,子元素的一個沒有被反序列化。它儘管在xml中被填充,但在類實例中是null。

一點背景

我以前XsdObjectGenerator創建基於我的.xsd POCO類。然後,我可以將xml反序列化爲一個類實例並使用這些對象。

我修改了自動生成的類,方法是將它們包裝在名爲'TFS'的名稱空間中。

在項目中的某個點,我發現有必要將其中一個子元素放置在它自己的名爲「COM」的名稱空間中。

下一次我試圖將xml反序列化到類實例中時,子元素未被反序列化。

以下是TFS類代碼的相關片段,其中子元素名稱空間已更改爲COM。它還包含保留在TFS名稱空間中的父元素OrdDtl。

[XmlRoot(ElementName="OrdDtl",Namespace=Declarations.SchemaVersion,IsNullable=false),Serializable] 
    public class OrdDtl 
    { 
      [XmlElement(Type=typeof(COM.AcctSetup), ElementName="AcctSetup", IsNullable=false, Form=XmlSchemaForm.Qualified, Namespace = Declarations.SchemaVersion)] 
     [EditorBrowsable(EditorBrowsableState.Advanced)] 
      public COM.AcctSetup __AcctSetup; 

     [XmlIgnore] 
      public COM.AcctSetup AcctSetup 
     { 
      get 
      { 
       if (__AcctSetup == null) __AcctSetup = new COM.AcctSetup();  
       return __AcctSetup; 
      } 
      set {__AcctSetup = value;} 
     } 

這裏是包含在它自己的文件中的COM命名空間中的AcctSetup聲明:

[XmlRoot(ElementName = "AcctSetup", Namespace = Declarations.SchemaVersion, IsNullable = false), Serializable] 
    public class AcctSetup 
    { 
...... 
} 

,這裏是我的反序列化功能:

public static T XMLStringToXMLObject<T>(string pXmlString) 
    { 
     T retVal = default(T); 

     try 
     { 
      XmlSerializer vSerializer = new XmlSerializer(typeof(T)); 
      MemoryStream vMemoryStream = new MemoryStream(StringToUTF8ByteArray(pXmlString)); 
      XmlTextWriter vXmlTextWriter = new XmlTextWriter(vMemoryStream, Encoding.UTF8); 
      retVal = (T)vSerializer.Deserialize(vMemoryStream); 
     } 
     catch (System.Exception ex) 
     { 
      if (ExceptionMain.LogException(ex)) 
       throw; 
     } 

     return retVal; 
    } 

中獲得任何援助非常感謝COM.AcctSetup元素的反序列化。如果您需要更多信息或代碼示例,請告知我們。

+0

請原諒我的無知,但XMLIgnore對OrdDtl中的屬性做了什麼? – 2010-09-14 17:38:38

+0

它確保'公共COM.AcctSetup AcctSetup'屬性不被序列化或反序列化。請注意,在公共COM.AcctSetup __AcctSetup上面直接使用屬性名稱「AcctSetup」進行序列化和反序列化。我意識到這是一種反直觀的語法,但是這是由XsdObjectGen自動生成的。之前它曾在更改子元素上的名稱空間之前工作。 XMLIgnore標籤沒有改變。 – Dean 2010-09-14 17:44:19

回答

1

我想通了。 xml文件我試圖反序列化包含在根元素以下屬性:

xmlns="tfs" 

因此在XML文件中的每個元素是這個XML命名空間下。

我對代碼的更改主要是將AcctSetup元素放在單獨的xml命名空間「com」下。因此,爲了反序列化文件,該文件需要根元素中的'xmlns =「tfs」'和acctsetup子屬性上的單獨的'xmlns =「com」'屬性。

由於這不是我在上面的父元素上收到的文件的格式,所以AcctSetup元素被反序列化到類實例中。

我的解決方案是再次將'acctsetup'元素移回'tfs'命名空間。在我的特殊情況下,唯一的缺點是代碼重複的一小部分 - 但一切都可以再次運行。