序列化嵌套列表或备选项
本文关键字:选项 列表 嵌套 序列化 | 更新日期: 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
不支持将多个根对象写入同一个文件。将许多不同的对象序列化到单个文件