- repeatedly
- 3170
- 0
- 0
- 0
@repeatedly 間にmp_Objectを挟まないと速くなるのは確かですね。例えばJava版はソレが可能です。Java版はSchemaというクラスがあって、一端Objectに変換してから静的型に変換し直す方法と、直接静的型に変換する方法の、両方ができます。
2010-04-26 01:55:17@frsyuki 結局のところそれなんだよね.でもD言語の場合はprimitive型はprimitiveでJavaみたいにラッパーオブジェクトがないから,やるとなると結構な労力になるという.
2010-04-26 01:58:55@repeatedly Objectを間に挟めると、デシリアライズするデータの型が事前に分からないケースに対応できます。まずtuple<int,Object,Object>に変換し、intが0ならtuple<int,string,array<Object>>に変換するなど。
2010-04-26 01:59:08@repeatedly むむーなるほど。C++版の場合は、一端objectに変換する方法しか使えませんが、そのオーバーヘッドを極力小さくなるようにしています。msgpack::zoneを使って高速に確保するなど。
2010-04-26 02:01:52まぁexecuteを解体して一つのオブジェクトをデシリアライズするたびに処理を中断すればいいのだけど,Variantがデフォルトじゃない言語だと,あまり使い道が…
2010-04-26 02:04:02Rubyで、MessagePack があっても Marshal も欲しいみたいな話はあるなぁ。用途が違うーと。Java の serializable も。遅くて複雑で多言語間で使えなくても、object graphs やらをできるだけ正確に保存できるやつ。
2010-04-26 02:06:31Michelが最後の指摘しているcorrect class when unserializengはどういうことだろう?classそのもののserialization/deserializationのことだろうか?
2010-04-26 02:17:26@repeatedly MessagePackでは正規表現クラスはシリアライズできない、とか? 「これは正規表現です」という情報+バイト列で表現できないことはないですが、it doesn't seem likely it can be added easly ですね。
2010-04-26 02:23:42んーでもどちらにしても、クラスをシリアライズするには、必要な情報を全部シリアライズさせる関数が、クラスごとに必要になるから、MessagePackでも他のフォーマットでも、難しさ(作業量の多さ)はあまり変わらなそうだけど。
2010-04-26 02:25:46それをやる方法がMessagePackでは決められていない問題はある。例えば ["クラス名", メンバ, ...] にするなど、勝手に決めないとダメ。一応多言語間通信時の標準の方法は[メンバ, ...]で、クラス名は入らない=付加的な情報なしには正確にクラスを復元できない。
2010-04-26 02:28:12recreating object graphsってのは,要は参照とかその辺のグラフを正しく再現できないのを危惧しているということかな?つまりそういう参照グラフとか含めて綺麗に再現できないし,MessagePackではそれを追加できないのではないか?ってことかな?
2010-04-26 02:31:43うーん,でもRubyとかのMarshalがあるならまだしも,C++とかD言語でそこまで再現しているシリアライゼーションライブラリってあるのか?
2010-04-26 02:33:43オブジェクトの参照を保存できる、C++に対応したシリアライズ形式と言えば…CORBA? リモートオブジェクトは参照できるけど、同一メッセージ内のオブジェクトも参照できるのかな。良く知らない。boost::serializeは無理だった気がする
2010-04-26 02:37:56"class A -> class B"をシリアライズして,デシリアライズしても"class A -> class B"というのがオブジェクトグラフなんだろうけど,持ってる値は同じわけで,"class A' -> class B'"で何も問題が無い気がするんだけども…
2010-04-26 02:45:30@frsyuki やっぱり難しい気がするし,そこまでのグラフを正確に再現してメリットがあるのかどうか.IOとかは通常再現できないわけで…
2010-04-26 02:43:14@repeatedly 参照を保持できない一番の欠点は、循環した構造を保存できない点だと思います。ただメリットがあるかというと…微妙ですね。
2010-04-26 02:49:31そもそも俺自身が循環構造を作らないから,それがどこまでのデメリットなのかよく把握してない.LinkedListにmp_unpackを実装するとすれば,それはカスタムなものになるだろうし,循環構造を直接シリアライズ/デシリアライズできるメリットねぇ…
2010-04-26 02:53:12a = []; a.push(a); Marshal.load(Marshal.dump(a)) してみた。できた。[[...]] とか、初めて見た…。
2010-04-26 02:53:16@repeatedly mp_unpackを実装するときに、どうシリアライズしたら良いかの指針は欲しくなりそうですね。["クラス名", メンバ]にするか、{"name"=>"クラス名", "メンバ名"=>値}にするとか。多言語を考えるとクラス名は入れられなくて困るワケですが…。
2010-04-26 02:55:50a = []; a.push(a); MessagePack.pack(a) は、案の定 stack level too deep.
2010-04-26 02:56:47@frsyuki かなぁ.でも動的言語だとそれで旨味があるけど,静的に型が決まっている言語だと,デシリアライズしてクラス名とか取れても嬉しさが…
2010-04-26 02:58:07@repeatedly 違った型にデシリアライズしようとしたときに、変なインスタンスができずにエラーが出せる、というメリットがありますね。正規表現をシリアライズしたデータを、ツリーにデシリアライズできてしまうと困る、とか。…んー有用性は微妙ですね。別にできても良さそうな気も。
2010-04-26 03:01:25