http://d.hatena.ne.jp/korakurider/20050721/p1 で果敢にも挑戦されているが、僕も謎に挑戦してみる。
Tweak でのプロジェクト保存は2段階に分かれる。
- CProjectShell>>saveProjectOn: が起点になり
- IslandWriter>>snapshot: でメモリ書き出し
- IslandWriter>>storeSegmentFor:into:outPointers: で segment 書き出し。ImageSegment テクノロジ(?)使用
- CProjectWriter>>saveProjectOn: export 書き出し
- IslandWriter>>snapshot: でメモリ書き出し
ファイル構成は以下のようになっている(CProjectReader>>readProjectFrom:)
- 16バイト: マジックナンバー CProjectWriter archiveVersionID
- 残り: ZipArchive (project.isg)
- 16バイト: マジックナンバー CProjectWriter projectVersionID
- 残り: IslandStream
- exports/imports 外部オブジェクト
- segment セグメント配列
感覚的には、セグメントと言うごった煮スープのような物があって、それはメモリ内容を表している。Tweak でのプロジェクトはメモリを「切り取った物」なので、プロジェクトの中から外に何か参照している場合、その参照を断ち切らないといけない。その外部オブジェクトの情報が exports/imports だ。segment がオブジェクトの中身そのものであるのに比べて、exports/imports は exportOnIslandWriter: によってオブジェクトを記述するのに最低限必要な情報でシリアライズされる。
プロジェクト読み込み時に、セグメントは IslandReader>>loadSegmentFrom:outPointers: によって新しい環境に接木されて生き返る。
沢山バグがあるんだけど、exports とみなされるオブジェクトが間違ってるんじゃないかと思う事がある。korakurider さんの記事にあったように Duration を exports にしようとするあたりもよく分からない。
(* たくさん書き直しました)