ByteArray.readObject()はどんなオブジェクトでも返せるってわけじゃない
巷で話題のByteArrayも未熟な僕には少々荷が重いです。
ByteArray.writeObject()
ByteArray.readObject()
は任意のオブジェクトをバイナリデータに直列化(シリアライズ)して、それを復元(アンシリアライズ)したりできるらしいのですが、これって、Spriteなんかをバイナリー化してファイルとして保存できるんじゃないかと仮説を立ててみた。
そしたらhttp://noughts.jp/みたいにFlashのデータを補完したい場合、XML化したりDBに格納したりせず、オブジェクトの完全コピーを保存できるんじゃないかと。
(noughts.jpさんが実際にどうやってるのかは知らないけど)
で、ちょっとテストしたけど、そう簡単にはいかないみたい。というのも、
ByteArray.readObject()はどんなオブジェクトでも復元できるわけではない!
から。
おそらくByteArray.readObject()はバイナリーデータの中身を読み込んでそのつどオブジェクトをnewしている様子。実際にClassを作ってコンストラクタにtrace("foo")とか入れるとreadObject()のタイミングで帰ってくる。
そしてここからが重要! コンストラクタに引数を必須で渡さなければならない場合(function Foo(str:String)とか)に、「引数1個が必要ですが0個が指定されました」とエラーが帰ってくる!こりゃあまいった。なぜならreadObject()はバイナリーデータを走査し、オブジェクトをnewするが、、その際に引数を指定できないからだ。
Spriteの復元の場合、flash.geom.Transformで引っかかる。Transformクラスこそは第一引数にDisplayObjectが必須になるのでここで上記のエラーが出る。
これはどうしようもないな~
自分でSpriteByteArrayクラスを作ってreadObject()を実装する他ないのかな...
もうひとつできないことに気がついた。当たり前といえば当たり前だけど、オブジェクトのprivate変数はByteArray.writeObject()でも直列化できない。
ということはSpriteの複製はできなさそう。完璧に。
(SpriteにPrivate メンバーが一切無ければ大丈夫かもしれないけどとりあえず断念)