我正在尝试存储一个列表集合(每个列表包含超过20.000个int),并希望使用嵌套的lest,因为每天都会添加一个新列表。
最终我需要以下列方式访问数据:
"获取每个列表的第一个值并编译一个新列表"。
我非常喜欢序列化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);
}
}
}
奇怪的是list.Count保持为1,并且文件大小增加时列表中int的数量保持不变。
答案 0 :(得分:2)
您需要回放流并在读取和写入之间清除以前的数据:
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
将很高兴地读取文件中的(第一个)对象重新打开。
至于你的第二个问题,&#34;你如何建议我有效和快速地存储这些数据?&#34;,因为你的计划是&#34;取每个列表的第一个值并编译一个新列表&#34;,在编写新列表时,您似乎需要重新读取前面的列表。但是,如果不是这样,并且每个新列表都独立于前面的列表,BinaryFormatter
确实支持将多个根对象写入同一个文件。有关详细信息,请参阅此处:Serializing lots of different objects into a single file