オブジェクトをシリアライズ・デシリアライズするには
Scala
Javaのシリアライズ 2016/05/12
書き出しの例
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.Serializable
が
java.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形式 2014/04/22
例
// 連想配列から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形式 2014/09/16
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 2014/03/02
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形式 2014/03/02
例
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形式 2014/05/28
例
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