スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#入門基本編落穂拾い その28 (シリアル化)

シリアル化(直列化)というのはデーターをビット列に直して、ディスクに書き込んだり、ネットワークを通じて送信したりできるように、することです。
.NET組み込みのシリアル化のルーティーンを利用した例を紹介します。
 
例としてなんらかのデータをファイルに保存してみます。
 
> open System.IO
open System.Runtime.Serialization.Formatters.Binary;;
 
まずは書き込む部分です。
 
> let saveValue filename x =
    use stream = new FileStream(filename,FileMode.Create)
    (new BinaryFormatter()).Serialize(stream,box x);;
 
val saveValue : string -> 'a -> unit
 
次は読み込み部分です。
 
let loadValue filename =
    use stream = new FileStream(filename,FileMode.Open)
    (new BinaryFormatter()).Deserialize(stream) |> unbox
 
では使用してみます。
 
書き込みます。
> saveValue "test1.dat" [1;2;3;4;5];;
val it : unit = ()
 
読み込みます。
> let savedD  =loadValue "test1.dat";;
 
  let savedD  =loadValue "test1.dat";;
  ----^^^^^^
 
 error FS0030: Value restriction. The value 'savedD' has been inferred to have generic type
    val savedD : '_a    
Either define 'savedD' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation.
というように、型指定がないので失敗しました。それでは型指定をつけてみます。
 
> let (savedD : int list) =loadValue "test1.dat";;
 
val savedD : int list = [1; 2; 3; 4; 5]
 
ツリーの保存も試してみます。
 
type BTree<'a> =
    |Empty
    |Node of ('a * BTree<'a> * BTree<'a>)
 
let t0= Node(3, Node (4, Node (9, Empty, Empty), Node (5, Empty, Empty)),
         Node (7, Empty, Node (2, Empty, Empty)))
         
 > saveValue "test2.dat" t0;;
val it : unit = ()
 
読み込んでみます。
> let (savedD2 : BTree<int>) = loadValue "test2.dat";; 
 
val savedD2 : BTree<int> =
  Node
    (3, Node (4, Node (9, Empty, Empty), Node (5, Empty, Empty)),
     Node (7, Empty, Node (2, Empty, Empty)))
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。