Serialise嵌套列表或替代品

时间:2015-06-08 07:11:27

标签: c# list serialization nested

我正在尝试存储一个列表集合(每个列表包含超过20.000个int),并希望使用嵌套的lest,因为每天都会添加一个新列表。 最终我需要以下列方式访问数据: &#34;获取每个列表的第一个值并编译一个新列表&#34;。 我非常喜欢序列化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的数量保持不变。

1 个答案:

答案 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