Проблема
У меня проблема с десериализацией моего xml, один из дочерних элементов не десериализован. Он равен нулю в экземпляре класса, несмотря на то, что он заполнен в XML.
Немного фона
Я использовал XsdObjectGenerator для создания классов poco на основе моего .xsd. Затем я смог десериализовать xml в экземпляр класса и работать с объектами.
Я изменил автоматически сгенерированные классы, поместив их в пространство имен с именем 'TFS'.
В определенный момент в проекте я счел необходимым поместить один из дочерних элементов в свое собственное пространство имен с именем «COM».
В следующий раз, когда я попытался десериализовать xml в экземпляр класса, дочерний элемент не десериализовался.
Вот соответствующий фрагмент кода класса TFS, в котором пространство имен дочернего элемента изменено на COM. Он также включает в себя родительский элемент OrdDtl, который остается в пространстве имен TFS.
[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;}
}
Вот объявление AcctSetup в пространстве имен COM, которое содержится в его собственном файле:
[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. Дайте мне знать, если вам нужна дополнительная информация или примеры кода.