Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 序列化嵌套列表或替代项_C#_List_Serialization_Nested - Fatal编程技术网

C# 序列化嵌套列表或替代项

C# 序列化嵌套列表或替代项,c#,list,serialization,nested,C#,List,Serialization,Nested,我正在尝试存储一个列表集合(每个列表包含超过20000个int),并且希望使用嵌套的test,因为每天都会添加一个新的列表。 最终,我需要通过以下方式访问数据: “获取每个列表的第一个值并编译一个新列表”。 我很想序列化一个列表,但是这似乎不起作用(我可以序列化一个列表)。这样做有什么诀窍吗(最好不用任何插件) 如果没有,您会如何建议我高效、快速地存储此类数据 我现在尝试的方式是: static void saveFunction(List<int> data, st

我正在尝试存储一个列表集合(每个列表包含超过20000个int),并且希望使用嵌套的test,因为每天都会添加一个新的列表。 最终,我需要通过以下方式访问数据: “获取每个列表的第一个值并编译一个新列表”。 我很想序列化一个
列表
,但是这似乎不起作用(我可以序列化一个
列表
)。这样做有什么诀窍吗(最好不用任何插件)

如果没有,您会如何建议我高效、快速地存储此类数据

我现在尝试的方式是:

        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);
            }
        }
        }
静态void保存函数(列表数据、字符串名称)
{
使用(Stream=File.Open(name+“.bin”,FileMode.OpenOrCreate))
{
BinaryFormatter bin=新的BinaryFormatter();
如果(stream.Length==0)
{
列表=新列表();
列表。添加(数据);
序列化(流、列表);
}
其他的
{
List List=(List)bin.反序列化(流);
列表。添加(数据);
序列化(流、列表);
}
}
}

奇怪的是,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);
            }
        }
    }
静态void保存函数(列表数据、字符串名称)
{
使用(Stream=File.Open(name+“.bin”,FileMode.OpenOrCreate))
{
BinaryFormatter bin=新的BinaryFormatter();
如果(stream.Length==0)
{
var List=新列表();
列表。添加(数据);
序列化(流、列表);
}
其他的
{
var List=(List)bin.反序列化(流);
列表。添加(数据);
stream.SetLength(0);//清除文件中的旧数据
序列化(流、列表);
}
}
}
您现在要做的是将新列表追加到文件的末尾,同时保留旧列表的原样--
BinaryFormatter
将在重新打开文件时愉快地作为文件中的(第一个)对象读取


至于你的第二个问题,“你会建议我如何高效、快速地存储这些数据?”,因为你的计划是“获取每个列表的第一个值并编译一个新列表”,因此在编写新列表时,你似乎需要重新阅读前面的列表。但是,如果不是这样,并且每个新列表独立于前面的列表,
BinaryFormatter
支持将多个根对象写入同一文件。详情请参见此处:

请参见,其中的共识是“不,他们不应该”!每次序列化…都会覆盖现有列表。列表将始终有一个元素。如果不序列化块序列(一个接一个),则必须反序列化旧列表,添加新元素并再次序列化它。一般来说,它的速度非常慢,所以您最好一个接一个地序列化它们(试图结束)。缺点是你必须把它们全部读一遍才能得到最后一个(除非你保留了某种索引)。如果事情变得更加复杂,并且您有性能要求,那么事情将变得更加复杂。