代码之家  ›  专栏  ›  技术社区  ›  Dean

子XML元素未反序列化

  •  1
  • Dean  · 技术社区  · 14 年前

    问题

    当反序列化XML时,我遇到了一个问题,其中一个子元素没有被反序列化。它在类实例中为空,尽管它被填充在XML中。

    有点背景

    我用 XsdObjectGenerator 基于my.xsd创建poco类。然后,我能够将XML反序列化为类实例并处理对象。

    我通过将自动生成的类包装在一个名为“tfs”的命名空间中来修改它们。

    在项目的某一点上,我发现有必要将一个子元素放在它自己的名为“com”的命名空间中。

    下一次我试图将XML反序列化到类实例中时,没有反序列化子元素。

    下面是将子元素命名空间更改为com的相关tfs类代码片段。它还包括保留在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 回复  |  直到 14 年前
        1
  •  1
  •   Dean    14 年前

    我知道了。我试图反序列化的XML文件在根元素中包含以下属性:

    xmlns="tfs"
    

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

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

    因为这不是我在accetsetup元素上面的父元素上接收的文件的格式,所以将该元素反序列化到类实例中。

    我的解决方案是再次将“acctsetup”元素移回“tfs”命名空间。在我的特殊情况下,唯一的缺点是代码有一点重复——但是一切都会再次正常工作。