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