序列化嵌套列表或备选项

本文关键字:选项 列表 嵌套 序列化 | 更新日期: 2023-09-27 17:54:01

我试图存储列表的集合(每个包含超过20,000 int's),并希望使用嵌套的唯恐,因为每天都会添加一个新列表。最终我需要通过以下方式访问数据:"取每个列表的第一个值并编译一个新列表"。理想情况下,我想序列化一个List<List<int>>,但这似乎不起作用(我可以序列化一个List<int>)。有一个技巧做到这一点(最好没有得到任何插件)?

如果没有,你会建议我如何高效、快速地存储这些数据?

我现在尝试的方式:

        static void saveFunction(List<int> data, string name)
        {
        using (Stream stream = File.Open(name + ".bin", FileMode.OpenOrCreate))
        {
            BinaryFormatter bin = new BinaryFormatter();
            if (stream.Length == 0)
            {
                List<List<int>> List = new List<List<int>>();
                List.Add(data);
                bin.Serialize(stream, List);
            }
            else
            {
                List<List<int>> List = (List<List<int>>)bin.Deserialize(stream);
                List.Add(data);
                bin.Serialize(stream, List);
            }
        }
        }

奇怪的是这个列表。当文件大小增加时,Count保持为1,列表中int的个数也保持不变。

序列化嵌套列表或备选项

您需要倒带流并在读写之间清除先前的数据:

    static void saveFunction(List<int> data, string name)
    {
        using (Stream stream = File.Open(name + ".bin", FileMode.OpenOrCreate))
        {
            BinaryFormatter bin = new BinaryFormatter();
            if (stream.Length == 0)
            {
                var List = new List<List<int>>();
                List.Add(data);
                bin.Serialize(stream, List);
            }
            else
            {
                var List = (List<List<int>>)bin.Deserialize(stream);
                List.Add(data);
                stream.SetLength(0); // Clear the old data from the file
                bin.Serialize(stream, List);
            }
        }
    }

您现在正在做的是将新列表附加到文件的末尾,同时保留旧列表原样-当重新打开文件时,BinaryFormatter将高兴地将其作为文件中的(第一个)对象读取。

至于你的第二个问题,"你会建议我如何高效、快速地存储这些数据?",因为你的计划是"取每个列表的第一个值并编译一个新列表",看起来你在编写新列表时需要重新阅读前面的列表。但是,如果不是这样,并且每个新列表独立于前面的列表,则BinaryFormatter不支持将多个根对象写入同一个文件。将许多不同的对象序列化到单个文件