MessagePack for Dの余波

どこまでシリアライズ/デシリアライズを正確にするか -> メリットあんまなくね?
5
SKS rep @repeatedly

Michelの提案は難しいところだな.

2010-04-26 01:48:34
Sadayuki Furuhashi @frsyuki

@repeatedly 間にmp_Objectを挟まないと速くなるのは確かですね。例えばJava版はソレが可能です。Java版はSchemaというクラスがあって、一端Objectに変換してから静的型に変換し直す方法と、直接静的型に変換する方法の、両方ができます。

2010-04-26 01:55:17
SKS rep @repeatedly

@frsyuki 結局のところそれなんだよね.でもD言語の場合はprimitive型はprimitiveでJavaみたいにラッパーオブジェクトがないから,やるとなると結構な労力になるという.

2010-04-26 01:58:55
Sadayuki Furuhashi @frsyuki

@repeatedly Objectを間に挟めると、デシリアライズするデータの型が事前に分からないケースに対応できます。まずtuple<int,Object,Object>に変換し、intが0ならtuple<int,string,array<Object>>に変換するなど。

2010-04-26 01:59:08
Sadayuki Furuhashi @frsyuki

@repeatedly むむーなるほど。C++版の場合は、一端objectに変換する方法しか使えませんが、そのオーバーヘッドを極力小さくなるようにしています。msgpack::zoneを使って高速に確保するなど。

2010-04-26 02:01:52
SKS rep @repeatedly

まぁexecuteを解体して一つのオブジェクトをデシリアライズするたびに処理を中断すればいいのだけど,Variantがデフォルトじゃない言語だと,あまり使い道が…

2010-04-26 02:04:02
Sadayuki Furuhashi @frsyuki

Rubyで、MessagePack があっても Marshal も欲しいみたいな話はあるなぁ。用途が違うーと。Java の serializable も。遅くて複雑で多言語間で使えなくても、object graphs やらをできるだけ正確に保存できるやつ。

2010-04-26 02:06:31
SKS rep @repeatedly

Michelが最後の指摘しているcorrect class when unserializengはどういうことだろう?classそのもののserialization/deserializationのことだろうか?

2010-04-26 02:17:26
Sadayuki Furuhashi @frsyuki

@repeatedly MessagePackでは正規表現クラスはシリアライズできない、とか? 「これは正規表現です」という情報+バイト列で表現できないことはないですが、it doesn't seem likely it can be added easly ですね。

2010-04-26 02:23:42
Sadayuki Furuhashi @frsyuki

んーでもどちらにしても、クラスをシリアライズするには、必要な情報を全部シリアライズさせる関数が、クラスごとに必要になるから、MessagePackでも他のフォーマットでも、難しさ(作業量の多さ)はあまり変わらなそうだけど。

2010-04-26 02:25:46
Sadayuki Furuhashi @frsyuki

それをやる方法がMessagePackでは決められていない問題はある。例えば ["クラス名", メンバ, ...] にするなど、勝手に決めないとダメ。一応多言語間通信時の標準の方法は[メンバ, ...]で、クラス名は入らない=付加的な情報なしには正確にクラスを復元できない。

2010-04-26 02:28:12
SKS rep @repeatedly

recreating object graphsってのは,要は参照とかその辺のグラフを正しく再現できないのを危惧しているということかな?つまりそういう参照グラフとか含めて綺麗に再現できないし,MessagePackではそれを追加できないのではないか?ってことかな?

2010-04-26 02:31:43
SKS rep @repeatedly

うーん,でもRubyとかのMarshalがあるならまだしも,C++とかD言語でそこまで再現しているシリアライゼーションライブラリってあるのか?

2010-04-26 02:33:43
Sadayuki Furuhashi @frsyuki

オブジェクトの参照を保存できる、C++に対応したシリアライズ形式と言えば…CORBA? リモートオブジェクトは参照できるけど、同一メッセージ内のオブジェクトも参照できるのかな。良く知らない。boost::serializeは無理だった気がする

2010-04-26 02:37:56
SKS rep @repeatedly

"class A -> class B"をシリアライズして,デシリアライズしても"class A -> class B"というのがオブジェクトグラフなんだろうけど,持ってる値は同じわけで,"class A' -> class B'"で何も問題が無い気がするんだけども…

2010-04-26 02:45:30
SKS rep @repeatedly

@frsyuki やっぱり難しい気がするし,そこまでのグラフを正確に再現してメリットがあるのかどうか.IOとかは通常再現できないわけで…

2010-04-26 02:43:14
Sadayuki Furuhashi @frsyuki

@repeatedly 参照を保持できない一番の欠点は、循環した構造を保存できない点だと思います。ただメリットがあるかというと…微妙ですね。

2010-04-26 02:49:31
SKS rep @repeatedly

@frsyuki あー確かにそれはあるね.

2010-04-26 02:51:07
SKS rep @repeatedly

そもそも俺自身が循環構造を作らないから,それがどこまでのデメリットなのかよく把握してない.LinkedListにmp_unpackを実装するとすれば,それはカスタムなものになるだろうし,循環構造を直接シリアライズ/デシリアライズできるメリットねぇ…

2010-04-26 02:53:12
Sadayuki Furuhashi @frsyuki

a = []; a.push(a); Marshal.load(Marshal.dump(a)) してみた。できた。[[...]] とか、初めて見た…。

2010-04-26 02:53:16
SKS rep @repeatedly

自身への循環ってのはどうなんだww

2010-04-26 02:54:41
Sadayuki Furuhashi @frsyuki

@repeatedly mp_unpackを実装するときに、どうシリアライズしたら良いかの指針は欲しくなりそうですね。["クラス名", メンバ]にするか、{"name"=>"クラス名", "メンバ名"=>値}にするとか。多言語を考えるとクラス名は入れられなくて困るワケですが…。

2010-04-26 02:55:50
Sadayuki Furuhashi @frsyuki

a = []; a.push(a); MessagePack.pack(a) は、案の定 stack level too deep.

2010-04-26 02:56:47
SKS rep @repeatedly

@frsyuki かなぁ.でも動的言語だとそれで旨味があるけど,静的に型が決まっている言語だと,デシリアライズしてクラス名とか取れても嬉しさが…

2010-04-26 02:58:07
Sadayuki Furuhashi @frsyuki

@repeatedly 違った型にデシリアライズしようとしたときに、変なインスタンスができずにエラーが出せる、というメリットがありますね。正規表現をシリアライズしたデータを、ツリーにデシリアライズできてしまうと困る、とか。…んー有用性は微妙ですね。別にできても良さそうな気も。

2010-04-26 03:01:25