Детский элемент XML не десериализован - PullRequest
1 голос
/ 14 сентября 2010

Проблема

У меня проблема с десериализацией моего 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. Дайте мне знать, если вам нужна дополнительная информация или примеры кода.

1 Ответ

1 голос
/ 15 сентября 2010

Я понял это. XML-файл, который я пытался десериализовать, содержал следующий атрибут в корневом элементе:

xmlns="tfs"

Поэтому каждый элемент в XML-файле находился в этом пространстве имен XML.

Мои изменения в коде по существу помещали элемент AcctSetup в отдельное пространство имен xml 'com'. Поэтому, чтобы десериализовать файл, ему понадобится xmlns = "tfs" в корневом элементе и отдельный атрибут xmlns = "com" в дочернем атрибуте acctsetup.

Поскольку это был не тот формат файла, который я получал для родительских элементов над элементом AcctSetup, они были десериализованы в экземпляр класса.

Мое решение состояло в том, чтобы снова переместить элемент acctsetup обратно в пространство имен tfs. В моей конкретной ситуации единственным недостатком является небольшое дублирование кода, но все работает снова.

...