Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 子Xml元素未反序列化_C#_Xml Serialization_Xml Deserialization_Xsdobjectgen - Fatal编程技术网

C# 子Xml元素未反序列化

C# 子Xml元素未反序列化,c#,xml-serialization,xml-deserialization,xsdobjectgen,C#,Xml Serialization,Xml Deserialization,Xsdobjectgen,问题 我在反序列化xml时遇到了一个问题,其中一个子元素没有被反序列化。尽管在xml中填充,但在类实例中为null 一点背景 我过去常常基于我的.xsd创建poco类。然后,我能够将xml反序列化为类实例并处理对象 我通过将自动生成的类包装在名为“TFS”的命名空间中来修改它们 在项目的某一点上,我发现有必要将一个子元素放在它自己的名为“COM”的命名空间中 下次我试图将xml反序列化到类实例中时,子元素没有被反序列化 下面是子元素名称空间更改为COM的TFS类代码的相关片段。它还包括保留在TF

问题

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

一点背景

我过去常常基于我的.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;
    }
公共静态T XMLStringToXMLObject(字符串pXmlString)
{
T retVal=默认值(T);
尝试
{
XmlSerializer vSerializer=新的XmlSerializer(typeof(T));
MemoryStream VMMemoryStream=新的MemoryStream(StringToUTF8ByteArray(pXmlString));
XmlTextWriter vXmlTextWriter=新的XmlTextWriter(vMemoryStream,Encoding.UTF8);
retVal=(T)vSerializer.Deserialize(vMemoryStream);
}
catch(System.Exception-ex)
{
if(例外主日志例外(ex))
投掷;
}
返回返回;
}

非常感谢您对COM.AcctSetup元素进行反序列化的任何帮助。如果您需要其他信息或代码示例,请告诉我

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

xmlns="tfs"
因此,xml文件中的每个元素都在这个xml名称空间下

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

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


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

我发现了这一点。我试图反序列化的xml文件在根元素中包含以下属性:

xmlns="tfs"
因此,xml文件中的每个元素都在这个xml名称空间下

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

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


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

请原谅我的无知,但是XMLIgnore对OrdDtl中的属性做了什么?它确保了“public COM.AcctSetup AcctSetup”属性不会被序列化或反序列化。请注意,在使用属性名“AcctSetup”序列化和反序列化的对象的正上方有一个“public COM.AcctSetup\uu AcctSetup”。我意识到这是一种违反直觉的语法,但这是XsdObjectGen自动生成的。在更改子元素的名称空间之前,它就已经工作了。XMLIgnore标记未更改。请原谅我的无知,XMLIgnore对OrdDtl中的属性做了什么?它确保“public COM.AcctSetup AcctSetup”属性未序列化或反序列化。请注意,在使用属性名“AcctSetup”序列化和反序列化的对象的正上方有一个“public COM.AcctSetup\uu AcctSetup”。我意识到这是一种违反直觉的语法,但这是XsdObjectGen自动生成的。在更改子元素的名称空间之前,它就已经工作了。XMLIgnore标记未更改。