反序列化的 Xml 对象循环引发 NullReferenceException

Deserialized Xml Object Loop Throws NullReferenceException

提问人:waltmagic 提问时间:6/7/2014 最后编辑:Communitywaltmagic 更新时间:6/7/2014 访问量:387

问:

这是另一个问题的延续,所有与这个问题相关的代码都可以在这里找到。我遇到了一个奇怪的NullReferenceException错误,我只是无法弄清楚。我正在尝试从反序列化的 Web 响应构建一个表。当我去遍历对象项时,我遇到了 NRE。奇怪的是,我通过它自己测试了我的条件陈述,我能够抓住它。这是我的代码:

    public string getExample()
    {
        DataTable dt = new DataTable();
        XmlSerializer serializer = new XmlSerializer(typeof(WeeklyJobs));
        WeeklyJobs jobs;
        string xml = @"<?xml version = ""1.0""?>"
            + @"<WeeklyJobs>"
            + @"<DailyJobs Date = ""02/03/2012""/>"
            + @"<DailyJobs Date = ""02/04/2012"" TotalJobs = ""2"">"
            + @"<Jobs>"
            + @"<Job JobName = ""Job Name"" Description = ""Description""/>"
            + @"<Job JobName = ""Job Name"" Description = ""Description""/>"
            + @"</Jobs>"
            + @"</DailyJobs>"
            + @"<DailyJobs Date = ""02/05/2012"" TotalJobs = ""1"">"
            + @"<Jobs>"
            + @"<Job JobName = ""Job Name"" Description = ""Description""/>"
            + @"</Jobs>"
            + @"</DailyJobs>"
            + @"<DailyJobs Date = ""02/06/2012"" TotalJobs = ""2"">"
            + @"<Jobs>"
            + @"<Job JobName = ""Job Name"" Description = ""Description""/>"
            + @"<Job JobName = ""Job Name"" Description = ""Description""/>"
            + @"</Jobs>"
            + @"</DailyJobs>"
            + @"<DailyJobs Date = ""02/07/2012""/>"
            + @"</WeeklyJobs>";

        // Create an XmlTextReader
        using (XmlReader reader = XmlReader.Create(new StringReader(xml)))
        {
            jobs = (WeeklyJobs)serializer.Deserialize(reader);
        }

    // Create Table
        dt.Columns.Add("Date");
        dt.Columns.Add("JobName");
        dt.Columns.Add("Description");

        for (int i = 0; i < jobs.Items.Length; i++ )
        {
            DataRow dr;
            object[] rowItems = null;
            rowItems[0] = jobs.Items[i].Date;
            if(jobs.Items[i].Jobs == null || jobs.Items[i].Jobs.Length == 0) //NRE is thrown Here <--
            {
                rowItems[1] = "";
                rowItems[2] = "";
            }
            else
            {
                foreach (WeeklyJobsDailyJobsJobsJob job in jobs.Items[i].Jobs)
                {
                    rowItems[1] = job.JobName;
                    rowItems[2] = job.Description;
                }
            }

            dr = dt.NewRow();
            dr.ItemArray = rowItems;
            dt.Rows.Add(dr);
        }

        return dt.Rows.Count.ToString();
    }

现在这是我无法弄清楚的部分。当我注释掉 Create Table 代码并在我知道为 null 的项上添加 if 语句时,条件会正确处理它。这是我在注释掉 Create Table 代码后添加的内容:

        if(jobs.Items[0].Jobs == null)
        {
            return "null";
        }
        else
        {
            return jobs.Items[0].Jobs.Length.ToString();
        }

它返回“null”。我不确定发生了什么。也许我的 for 循环设置不正确?感谢您的帮助!

C# XML 反序列化 NullReferenceException

评论

2赞 L.B 6/7/2014
你为什么不简单地使用DataSet ds = new DataSet(); ds.ReadXml(new StringReader(xml));
0赞 TyCobb 6/7/2014
你真的有一门课叫吗?对不起,它像拇指酸痛一样突出。WeeklyJobsDailyJobsJobsJob
0赞 waltmagic 6/7/2014
我同意。。。我使用 xsd.exe 为我创建了一个带有一些 xml 的类。看起来很可怕
0赞 waltmagic 6/7/2014
@L.B 我最初尝试使用 DataSet,但在按日期对齐作业时遇到问题,因为我得到的 XML 响应为 WeeklyJobs、DailyJobs、Jobs 和 Job 创建了单独的类。建议我尝试 XmlSerializer,并在我决定学习如何使用它之前感觉我没有使用过这个类。我知道代码是菜鸟,那是因为我是这个:)的新手
0赞 phoog 6/7/2014
@L.B 我是推荐 XmlSerializer 的人,但如果我知道 waltmagic 将数据复制到数据集中,我会建议弄清楚如何让数据集按照他想要的方式正常工作。我的意思是建议将 XmlSerializer 作为将数据导入内存的替代方法。

答:

2赞 phoog 6/7/2014 #1

你知道,我经常看到调试器在异常发生后将执行点放在行上,当它中断时。

也许这是你的问题:

object[] rowItems = null;
rowItems[0] = jobs.Items[i].Date;

NRE 由索引器调用对 null 数组引发。

评论

0赞 waltmagic 6/7/2014
object[] rowItems = 新对象[dt.Columns.Count];清除了 NRE。我觉得很傻,天哪......再次感谢!
0赞 phoog 6/7/2014
@waltmagic我们都时不时地做这样傻事。调试器指示异常的错误行根本无济于事。如果它指示正确的行,您将在 10 秒内解决问题。