オブジェクトをシリアライズ・デシリアライズするには

Scala

Javaのシリアライズ

書き出しの例

val oos = new java.io.ObjectOutputStream(new java.io.FileOutputStream(filePath));
try {
  oos.writeObject(obj);
} finally {
  oos.close();
}

読み込みの例

val ois = new java.io.ObjectInputStream(new java.io.FileInputStream(filePath));
try {
  ois.readObject().asInstanceOf[MorphologicalAnalyzer];
} finally {
  ois.close();
}

java.io.Serializable を実装している必要がある。必ずしも extends java.io.Serializable と書かなくても、単に extends Serializable でよい。 scala.Serializablejava.io.Serializable をextendsしていて、代わりに使えるためである。

case class は勝手に java.io.Serializable を実装してくれている。

たぶん過去のバージョンではクラス定義に @serializable というアノテーションを付けるだけでもよかったのかもしれないが、手元の Scala 2.10.4 の環境ではこのアノテーションに関して deprecated の警告が出た。 2.11 ではもうコンパイルエラーになった。

Javaの serialVersionUID フィールドを設定するにはクラス定義に @SerialVersionUID(123456L) というようにアノテーションをつければよい。 SerialVersionUID がintの範囲を超える数の場合、L を最後に付けないとコンパイルエラーになることに注意。

PHP

JSON形式

// 連想配列からJSONにエンコード
$json_src = json_encode($arr);

// JSONからオブジェクトにデコード
$obj = json_decode($json_src);

// JSONから連想配列にデコード
$arr = json_decode($json_src, true);

json_encode 関数 | PHP Manual
http://www.php.net/manual/ja/function.json-encode.php

json_decode 関数 | PHP Manual
http://www.php.net/manual/ja/function.json-decode.php

要素の最後の余計なカンマがあるとパースできない。

{"a": 1, "b": 2}
// => OK

{"a": 1, "b": 2, }
// => NG

JSONのフォーマットがおかしいなどでデコードできなかった場合は NULL が返される。

Python

JSON形式

import json

src = {'a': 1, 'b': [3, 4, 5]}
serialized = json.dumps(src)
print(serialized)
# => {"a": 1, "b": [3, 4, 5]}

dst = json.loads(serialized)
print(dst)
# => {'a': 1, 'b': [3, 4, 5]}

Python2でもPython3でも動くが、自分の環境でのPython2と3とで表示される要素の順番が少し違った。

配列の要素の最後に余計なコンマがあると、デコード時にエラーになる。

Ruby

Marshal

Marshalを使ったオブジェクトの書き出しと読み出しの例

src = {'a' => 1, 'b' => [3, 4, 5]}

serialized = Marshal.dump(src)

dst = Marshal.load(serialized)

p dst
# => {"a"=>1, "b"=>[3, 4, 5]}

Marshalを使って書き出されたバイナリデータはRuby独自のもので、他の言語で読み書きするのは困難なようである。

YAML形式

require 'yaml'

src = {'a' => 1, 'b' => [3, 4, 5]}

serialized = src.to_yaml

dst = YAML.load(serialized)

p dst
# => {"a"=>1, "b"=>[3, 4, 5]}

JSON形式

require 'json'

src = {'a' => 1, 'b' => [3, 4, 5]}

serialized = JSON.generate(src)

puts serialized
# => {"a":1,"b":[3,4,5]}

dst = JSON.parse(serialized)

p dst
# => {"a"=>1, "b"=>[3, 4, 5]}

JSONを改行やインデントを入れて人間にとって読みやすいソースを生成するには generateメソッドの代わりにpretty_generateメソッドを使う。

module JSON | Ruby Reference Manual
http://docs.ruby-lang.org/ja/2.1.0/class/JSON.html

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク