问题
当我反序列化我的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 :(得分:1)
我想出来了。我试图反序列化的xml文件在根元素中包含以下属性:
xmlns="tfs"
因此xml文件中的每个元素都在此xml命名空间下。
我对代码的更改主要是将AcctSetup元素放在一个单独的xml命名空间“com”下。因此,为了反序列化文件,该文件将需要根元素中的'xmlns =“tfs”'和acctsetup子属性上的单独'xmlns =“com”'属性。
由于这不是我在AcctSetup元素上面的父元素上接收的文件格式,因此被反序列化为类实例。
我的解决方案是将'acctsetup'元素再次移回'tfs'命名空间。在我的特殊情况下,唯一的缺点是一点点代码重复 - 但一切都有效。