子Xml元素未反序列化

时间:2010-09-14 17:29:37

标签: c# xml-serialization xml-deserialization xsdobjectgen

问题

当我反序列化我的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元素反序列化的帮助。如果您需要其他信息或代码示例,请与我们联系。

1 个答案:

答案 0 :(得分:1)

我想出来了。我试图反序列化的xml文件在根元素中包含以下属性:

xmlns="tfs"

因此xml文件中的每个元素都在此xml命名空间下。

我对代码的更改主要是将AcctSetup元素放在一个单独的xml命名空间“com”下。因此,为了反序列化文件,该文件将需要根元素中的'xmlns =“tfs”'和acctsetup子属性上的单独'xmlns =“com”'属性。

由于这不是我在AcctSetup元素上面的父元素上接收的文件格式,因此被反序列化为类实例。

我的解决方案是将'acctsetup'元素再次移回'tfs'命名空间。在我的特殊情况下,唯一的缺点是一点点代码重复 - 但一切都有效。