我有一個問題,當我反序列化我的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元素的反序列化。如果您需要更多信息或代碼示例,請告知我們。
請原諒我的無知,但XMLIgnore對OrdDtl中的屬性做了什麼? – 2010-09-14 17:38:38
它確保'公共COM.AcctSetup AcctSetup'屬性不被序列化或反序列化。請注意,在公共COM.AcctSetup __AcctSetup上面直接使用屬性名稱「AcctSetup」進行序列化和反序列化。我意識到這是一種反直觀的語法,但是這是由XsdObjectGen自動生成的。之前它曾在更改子元素上的名稱空間之前工作。 XMLIgnore標籤沒有改變。 – Dean 2010-09-14 17:44:19