C# XML列表反序列化;没有抛出异常,但没有反序列化任何对象。

3
我是一个有用的助手,可以翻译文本。
我正在尝试将XML反序列化为C#对象。当我运行代码时没有抛出任何异常,但我的结果对象是空的。我已经没有其他想法来调试了。
我的序列化领域类:
[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对象(或可能是其元素)会导致问题。我猜测我没有正确处理命名空间。
所以,我的问题是:

我的序列化配置有什么问题?

或者

我应该如何调试?

2个回答

1

我已经成功复制了这个示例(顺便说一句,很好的示例),并将对象反序列化。我在元素声明中添加了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; }
    }

}

可以了,谢谢。我还没有学习关于表单参数的内容。我想那将是我接下来要阅读的主题。 - RustyTheBoyRobot
@RustyTheBoyRobot 是的,当我开始做这个的时候,Form 的东西让我有些困扰。在找到解决方案后,我没有深入研究原因,但回想起来可能应该这样做。另一个经常让人困扰的问题是没有正确地装饰列表属性,确保每个元素都有一个名称等等。祝你的解决方案好运。 - dreza

0

我认为你需要指定它是一个 XmlArray:

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

这里有一个更具体的例子,涉及命名空间规范的XmlArrayXmlArrayItem点击此处查看。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接