2017-07-27 12 views
-1

トライ(this oneベース)を使用してポリッシュ辞書(37.9MB)を保存するWPFアプリケーションを作成しました。 dictionary.txtから作成するには時間がかかりすぎます(ノートパソコンでは30秒)。c#で作成されたトライを保存/ロードする方法WPF

私は、もし既に何らかのバイナリファイルを作成しておき、それを読み込んだら、それを高速化すると思っていました。

答えて

0

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; 
} 
+0

2つの違いは何ですか?そして、これらのソリューションはどのように(可)ポータブルですか?私のアプリケーションのリリース版を作成すると、それはすべてのWindows(.NETで)で動作するのだろうか? – Jecke

+0

したがって、シリアル化に関する私の経験は、XMLがプログラムのバージョン間でより安全であることですが、バイナリは高速で、ファイルサイズがはるかに小さくなる可能性が高くなります。バイナリを使用してファイルをシリアライズすると、クラスのバージョンに結び付けられます。プログラムは更新できますが、シリアライズされたクラスを変更すると、ISerializableを実装してすべてのシリアライズ関数を自分で実行しない限り、 XMLはリビジョン間では安全ですが、書式設定の形式で保存ファイルに多くのオーバーヘッドが含まれます。 どちらもポータブルです。 –

+0

バイナリのシリアライゼーションを使ってみました(コードをコピーして、トライをロード済みのポーランド語の辞書と '' dict.xml ''に '' path "'で置き換えた)、私が得たファイルはかなり大きかった:54.2MB (37.9MBのdictionary.txtとは対照的に)。私はそれをロードしようとしましたが(もう一度、 'return'を' Trie my_dictionary = 'に変更してコードをコピーしました)、それはちょっと止まっています。 – Jecke

関連する問題