десериализация XML-списка C#; исключение не выбрасывается, но объекты не десериализуются

Я пытаюсь десериализовать XML в объекты С#. Когда я запускаю свой код, исключения не выдаются, но мой результирующий объект пуст. У меня нет идей для отладки.

Мои классы домена сериализации:

[SerializableAttribute()]
[XmlTypeAttribute(TypeName = "group_lookup_result")]
[XmlRootAttribute("group_lookup_result")]
public class GroupLookupResult
{
    private string _groupId;
    private string _groupName;

    public GroupLookupResult()
    {
        _groupId = "";
        _groupName = "";
    }

    [XmlElement("group_id")]
    public string GroupID
    {
        get { return _groupId; }
        set { _groupId = value; }
    }

    [XmlElement("group_name")]
    public string GroupName
    { 
        get { return _groupName; }
        set { _groupName = value; }
    }
}

[SerializableAttribute()]
[XmlRootAttribute(ElementName = "group_lookup_result_list", IsNullable = false, Namespace = "http://ws.byu.edu/namespaces/gro/v1")]
[XmlTypeAttribute(TypeName = "group_lookup_result_list", Namespace = "http://ws.byu.edu/namespaces/gro/v1")]
public class GroupLookupResultList
{
    private List<GroupLookupResult> _searchResults;

    public GroupLookupResultList() { }

    [XmlArrayItem(IsNullable = false)]
    public List<GroupLookupResult> group_lookup_results
    {
        get { return _searchResults; }
        set { _searchResults = value; }
    }

}

Мой код десериализации:

class Program
{
    static void Main(string[] args)
    {
        string incomingXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>" +
            "<ns2:group_lookup_result_list xmlns:ns2=\"http://ws.byu.edu/namespaces/gro/v1\">" + 
                "<group_lookup_results>" + 
                    "<group_lookup_result>" + 
                        "<group_id>bradtest</group_id>" + 
                        "<group_name>Brad's Test Group</group_name>" +
                        "<effective_date>2011-05-04T00:00:00-06:00</effective_date>" + 
                        "<expiration_date>2014-01-10T23:59:59-07:00</expiration_date>" + 
                    "</group_lookup_result>" + 
                    "<group_lookup_result>" + 
                        "<group_id>brjtest</group_id>" + 
                        "<group_name>Bernt's Test Group</group_name>" + 
                        "<effective_date>2011-05-05T00:00:00-06:00</effective_date>" + 
                        "<expiration_date>2012-05-05T23:59:59-06:00</expiration_date>" + 
                    "</group_lookup_result>" + 
                "</group_lookup_results>" + 
            "</ns2:group_lookup_result_list>";
        XmlSerializer searchResultSerializer = new XmlSerializer(typeof(GroupLookupResultList));
        System.IO.StringReader reader = new System.IO.StringReader(incomingXml);

        GroupLookupResultList resultList = (GroupLookupResultList)searchResultSerializer.Deserialize(reader);
        System.Diagnostics.Debug.WriteLine("Deserialized " + resultList.group_lookup_results.Count + " results");
    }
}

Я понимаю, что мои объекты домена не десериализуют <effective_date> или <expiration_date>, но раньше я игнорировал элементы XML, и у меня не было проблем. Я также попытался десериализовать один group_lookup_result, и это было успешно; кажется, что проблемы вызывает только объект group_lookup_result_list (или, возможно, его элемент List). Я предполагаю, что я неправильно обрабатываю пространства имен.

Итак, мои вопросы:

Что не так с моей конфигурацией сериализации?

or

Как я могу отладить это?


person RustyTheBoyRobot    schedule 22.03.2012    source источник


Ответы (2)


Мне удалось воспроизвести это (кстати, хороший пример) и десериализовать объекты. Я добавил Form = System.Xml.Schema.XmlSchemaForm.Unqualified к объявлениям элементов, и это помогло. Я также немного изменил свойство group_lookup_results, чтобы информировать десериализатор об именах отдельных элементов элемента (используя XmlArrayItemAttribute).

Код ниже.

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        string incomingXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>" +
       "<ns2:group_lookup_result_list xmlns:ns2=\"http://ws.byu.edu/namespaces/gro/v1\">" +
           "<group_lookup_results>" +
               "<group_lookup_result>" +
                   "<group_id>bradtest</group_id>" +
                   "<group_name>Brad's Test Group</group_name>" +
                   "<effective_date>2011-05-04T00:00:00-06:00</effective_date>" +
                   "<expiration_date>2014-01-10T23:59:59-07:00</expiration_date>" +
               "</group_lookup_result>" +
               "<group_lookup_result>" +
                   "<group_id>brjtest</group_id>" +
                   "<group_name>Bernt's Test Group</group_name>" +
                   "<effective_date>2011-05-05T00:00:00-06:00</effective_date>" +
                   "<expiration_date>2012-05-05T23:59:59-06:00</expiration_date>" +
               "</group_lookup_result>" +
           "</group_lookup_results>" +
       "</ns2:group_lookup_result_list>";
        XmlSerializer searchResultSerializer = new XmlSerializer(typeof(GroupLookupResultList));
        System.IO.StringReader reader = new System.IO.StringReader(incomingXml);

        GroupLookupResultList resultList = (GroupLookupResultList)searchResultSerializer.Deserialize(reader);
        System.Diagnostics.Debug.WriteLine("Deserialized " + resultList.group_lookup_results.Count + " results");

    }
}

[SerializableAttribute()]
[XmlTypeAttribute(TypeName = "group_lookup_result")]
[XmlRootAttribute("group_lookup_result")]
public class GroupLookupResult
{
    private string _groupId;
    private string _groupName;

    public GroupLookupResult()
    {
        _groupId = "";
        _groupName = "";
    }

    [XmlElement("group_id", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string GroupID
    {
        get { return _groupId; }
        set { _groupId = value; }
    }

    [XmlElement("group_name", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string GroupName
    {
        get { return _groupName; }
        set { _groupName = value; }
    }
}

[SerializableAttribute()]
[XmlRootAttribute(ElementName = "group_lookup_result_list", IsNullable = false, Namespace = "http://ws.byu.edu/namespaces/gro/v1")]
[XmlTypeAttribute(TypeName = "group_lookup_result_list", Namespace = "http://ws.byu.edu/namespaces/gro/v1")]
public class GroupLookupResultList
{
    private List<GroupLookupResult> _searchResults;

    public GroupLookupResultList() { }

    [System.Xml.Serialization.XmlArrayAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    [System.Xml.Serialization.XmlArrayItemAttribute("group_lookup_result", Form = System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable = false)]
    public List<GroupLookupResult> group_lookup_results
    {
        get { return _searchResults; }
        set { _searchResults = value; }
    }

}
person dreza    schedule 22.03.2012
comment
Это сработало; благодаря. Я еще не узнал о параметрах формы. Думаю, это будет моей следующей темой для чтения. - person RustyTheBoyRobot; 22.03.2012
comment
@RustyTheBoyRobot да, материал Form меня немного ужалил, когда я впервые начал этим заниматься. Я не стал вникать в причины после того, как нашел решение, но, вероятно, должен был оглянуться назад. Еще одна вещь, которая часто раздражала, заключалась в том, что свойства списка не украшались должным образом, гарантируя, что у отдельных элементов есть имя и т. Д. Удачи с вашими решениями. - person dreza; 22.03.2012

Я думаю, вам нужно указать, что это также XmlArray:

[XmlArray("group_lookup_results")]
[XmlArrayItem(IsNullable = false)]
public List<GroupLookupResult> group_lookup_results;

Существует более конкретный пример XmlArray и XmlArrayItem со спецификациями пространства имен здесь

person SwDevMan81    schedule 22.03.2012