首页 > 解决方案 > 如何在 c# 中使用 JSON 使用 foreach 序列化多个项目?

问题描述

我正在尝试从 2 个 ListView 序列化对象,ListView#2 用于显示分组的对象,而 ListView#2 显示所述组。(在#1 中选择一个组会在#2 中显示不同的对象集)

        JsonSerializer serializer = new JsonSerializer();
        using (StreamWriter sw = new StreamWriter(path + "\\data.txt"))
        {
            foreach (ListViewItem group in lV_groups.Items)
            {
                foreach (ListViewItem item in lV_items.Items)
                {
                    List<ItemSerObj> itemsObj = new List<ItemSerObj>()
                    {
                        new ItemSerObj
                        {
                            ItemName = item.SubItems[0].Text,
                            Value = item.SubItems[1].Text,
                            Quality = item.SubItems[2].Text,
                            TimeStamp = item.SubItems[3].Text
                        }
                    };

                    GroupSerObj serializeGroup = new GroupSerObj
                    {
                        GroupName = group.SubItems[0].Text,
                        UpdateRate = group.SubItems[1].Text,
                        Active = group.SubItems[2].Text,
                        Items = itemsObj

                    };


                    using (JsonWriter writer = new JsonTextWriter(sw))
                    {
                        serializer.Serialize(writer, serializeGroup); //Where exception occurs.
                    }
                }
            }
        }

我收到“System.ObjectDisposedException:'无法写入已关闭的 TextWriter'”异常。

标签: c#winformsserializationjsonserializer

解决方案


只需将其更改为以下内容:

JsonSerializer serializer = new JsonSerializer();
using (StreamWriter sw = new StreamWriter(path + "\\data.txt"))
{
    using (JsonWriter writer = new JsonTextWriter(sw))
    {
        foreach (ListViewItem group in lV_groups.Items)
        {
            List<ItemSerObj> itemsObj = new List<ItemSerObj>();

            foreach (ListViewItem item in lV_items.Items)
            {
                itemsObj.Add(
                new ItemSerObj
                {
                    ItemName = item.SubItems[0].Text,
                    Value = item.SubItems[1].Text,
                    Quality = item.SubItems[2].Text,
                    TimeStamp = item.SubItems[3].Text
                });           
            }

            GroupSerObj serializeGroup = new GroupSerObj
            {
                GroupName = group.SubItems[0].Text,
                UpdateRate = group.SubItems[1].Text,
                Active = group.SubItems[2].Text,
                Items = itemsObj
            };

            serializer.Serialize(writer, serializeGroup);
        }
    }
}

每次组迭代都会创建新列表,并且该列表会填充到内部 foreach 循环中。
后来添加到GroupSerObj序列化


推荐阅读