機能 #960
完了Modelをシリアライズ可能にする
0%
説明
要件¶
テキストにして、ファイルに保存するなど、IOオブジェクトに渡すことができるようにする。
目的¶
- メモリを共有しない空間で動作しているPluggaloidに対してイベントを送れるようにしたい(別のプロセスなど)
- キャッシュなどの目的で、単純にファイルに保存したい
特に2.については、 #957 でIntentTokenが保存できると便利なことがあるということがわかった。
シリアライズする範囲¶
定義されたfieldのみを対象とする。定義されていないフィールドは存在しなくても良いものや、単なるキャッシュであるため。
明示的に定義しているフィールドでdumpしたくないものもありそうなので、fieldのオプションで制御できるようにする。
インスタンス変数は全て対象外とする。
形式¶
特定の形式に縛られる必要はないとは思うが、JSONだけとかでもよさそう…。
Marshal¶
かつてはMessageが間違って設定などに保存されて、Marshal.loadされた時に不具合が発生することがあったが、今はそういったチェックをUserConfigでしっかり行っているのでこの制限には何の意味もない。
キャッシュなどの保存するデータが大量に含まれているという問題はある。マーシャライズの時も基本的には定義されたfieldだけが保存されていれば問題なさそう。
利点¶
Rubyでよく使われている方法でセーブ・ロードできる
欠点¶
Rubyでしか利用できない。ロードする環境に、Modelが定義されてなければならない。プラグインの削除やアップデートなどでModelの定義が消えた時にロードできなくなる可能性がある。
JSON¶
言語を問わずよく使われているのでさまざまなメリットがある。Rubyで扱うのも容易。
ただのオブジェクトとModelを見分けるために、またModelの種類を特定するために特殊なキーを入れる必要がありそう。
利点¶
他の言語でも扱うことができ、PluggaloidをMarshalの仕組みがないRubyの実装や他の言語に移植するのが容易になる。
mikutterに現在定義されていないModelを読み込んでもなんとかできそう。
欠点¶
表現できるオブジェクトの種類が限られている( Time
は文字列に変換する?など)。
関連するチケット