Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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#WPF中创建的trie_C#_Wpf_Optimization_Trie - Fatal编程技术网

如何保存/加载在c#WPF中创建的trie

如何保存/加载在c#WPF中创建的trie,c#,wpf,optimization,trie,C#,Wpf,Optimization,Trie,我制作了一个WPF应用程序,它使用trie(基于)来存储波兰语词典(37.9MB)。从dictionary.txt创建它花费了太多的时间(在我的笔记本电脑上30秒) 我想,如果我创建了某种二进制文件,并且已经完成了trie,然后将其加载,可能会加快速度。您可以尝试将其保存为一个序列化对象,可以是XML或二进制。您需要标记将使用该属性序列化的类。泛型集合已可序列化 [Serializable] public class Node { ... } [Serializable] public cla

我制作了一个WPF应用程序,它使用trie(基于)来存储波兰语词典(37.9MB)。从dictionary.txt创建它花费了太多的时间(在我的笔记本电脑上30秒)


我想,如果我创建了某种二进制文件,并且已经完成了trie,然后将其加载,可能会加快速度。

您可以尝试将其保存为一个序列化对象,可以是XML或二进制。您需要标记将使用该属性序列化的类。泛型集合已可序列化

[Serializable]
public class Node
{
...
}

[Serializable]
public class Trie
{
...
}
XML保存

var trie = new Trie();

using (var fs = new System.IO.FileStream("path", FileMode.CreateNew, FileAccess.Write, FileShare.None))
{
    Type objType = typeof (Trie);
    var xmls = new XmlSerializer(objType);

    xmls.Serialize(fs, trie);
}
XML加载

XmlSerializer xmls = new XmlSerializer(typeof(Trie));
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
    return xmls.Deserialize(fs) as Trie;
二进制存储

var trie = new Trie();
using (var fs = new System.IO.FileStream("path", FileMode.CreateNew, 
FileAccess.Write))
{
    var bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
    bf.Serialize(fs, trie);
}
二进制加载

using (var fs = new FileStream("Path", FileMode.Open, FileAccess.Read))
{
        var bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
        return bf.Deserialize(fs) as Trie;
}

这两者有什么区别?这些解决方案的可移植性如何?如果我为我的应用程序制作一个发布版本,它会在所有的窗口上运行吗(使用.NET)?因此,我的序列化经验是,XML在不同版本的程序之间更安全,但二进制更快,并且很可能会导致小得多的文件大小。当您使用二进制文件序列化文件时,它几乎与类的某个版本绑定在一起,程序可以更新,但是更改序列化类通常会破坏加载文件的能力,除非您自己实现ISerializable并执行所有序列化函数。XML在修订之间更安全,但在以格式形式保存文件时会包含大量开销。两者都是可移植的。我尝试使用二进制序列化(我只是简单地复制了您的代码,将
trie
更改为我的trie,并加载了波兰语词典,
“path”
更改为
“dict.xml”
),我得到的文件非常大:54.2MB(而不是37.9MB的dictionary.txt)。我尝试加载它(再次,简单地将您的代码更改
return
复制到
Trie my_dictionary=
),但它要么卡住了,要么加载了几分钟。。。我是做错了什么,还是还有其他问题?2.你似乎把你的评论混合在了二进制文件中,然后将其保存为xml。所以我假设你指的是二进制。如果将文件保存为二进制文件,请不要使用像xml这样的扩展名,否则会破坏可能认为它是xml文件的任何其他系统。使用dict.dat或其他非标准扩展名。我不希望它花费比您的系统读取54MB所花费的时间更长的时间,最多几秒钟。保存和读取的方法是否相同?您确定写入程序已关闭,并且read语句没有等待文件可用吗?首先我保存了它,然后重写了代码以加载它。函数是如何更改的:保存和加载。顺便说一下,当我将它另存为.dat时,大小是266MB。