#:g1: hu.dwim.serializerの紹介

Posted 2014-01-03 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の4日目です。

hu.dwim.serializerとはなにか

 Common Lispのオブジェクトをシリアライズ/デシリアライズするライブラリです。

パッケージ情報

パッケージ名hu.dwim.serializer
Quicklisp
公式サイトdarcs - HEAD hu.dwim.serializer
CLiKihttp://www.cliki.net/cl-serializer
Quickdocshttp://quickdocs.org/hu.dwim.serializer

インストール方法

(ql:quickload :hu.dwim.serializer)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 実はこのエントリーは、6年前に書いたエントリーのアップデートなのですが、この6年の間に名前が変更になったようです。
以前は、cl-serializerでしたが、dwim.huに集積されて、hu.dwim.serializerとなった様子。
使い方ですが、シンプルにhu.dwim.serializer:serializeと、hu.dwim.serializer:deserializeを利用します。

;;; ユーティリティを定義
(ql:quickload :series)

(defun ser (obj file) (let ((sr (hu.dwim.serializer:serialize obj))) (with-open-file (out file :direction :output :if-exists :supersede :element-type '(unsigned-byte 8)) (series:collect-stream out (series:scan sr) #'write-byte))))

(defun deser (file) (with-open-file (in file :element-type '(unsigned-byte 8)) (hu.dwim.serializer:deserialize (series:collect '(simple-array (unsigned-byte 8) (*)) (series:scan-stream in #'read-byte)))))

;; データ
(defvar *list* '(a (b c) a b (d e (f g (h i)))))

(defclass foo () (x y z))

;; 書き出し
(ser *list* "/var/tmp/ser.dat")

;; 読み込み (deser "/var/tmp/ser.dat") ;=> (A (B C) A B (D E (F G (H I)))) ;;; ;;; classの場合 ;;; ;; 書き出し (ser (make-instance 'foo) "/var/tmp/ser.dat")

;; 読み込み (describe (deser "/var/tmp/ser.dat")) ;>> #<FOO {10220CB053}> ;>> [standard-object] ;>> ;>> Slots with :INSTANCE allocation: ;>> X = #<unbound slot> ;>> Y = #<unbound slot> ;>> Z = #<unbound slot> ;>> ;=> <no values>

 クラスの場合は、読み込み元で定義されている必要があるようです。
スロット情報も読み込み元のものに合せられます。
この辺りは、予め書いておくか、クラス定義のLispコードを読み込んだりすればどうにかできる気もします。

hu.dwim.serializerの紹介/関連記事等

まとめ

 今回は、hu.dwim.serializerを紹介してみました。
dwim.huの人達は結構面白いことをやっているようなのですが、最近はサイトがメンテナンスされていないことが多いようです。
コード自体はアップデートされているようなので、darcsのリポジトリの方を眺めると良いのかもしれません。

comments powered by Disqus