24

Pythonピクルスのようなクラスと参照情報を保持するJavascriptのシリアル化フレームワークはありますか?つまり、プロトタイプの継承されたクラスインスタンス(JSONのようなデータだけでなく)を直接取得して、次のようにシリアル化することができます::

 // Somehow add serialization metadata to classes first
 obj = new MyObject();
 obj.referred = new MyObject2();
 pickle = serializer.dump(obj) // Provides byte stream of the serialized object  

シリアライザーが処理できます

  • ピクルスでのクラス情報のエンコード-これは、さまざまなJSクラスシステムが存在するため、何らかの形でカスタマイズ可能である必要があります

  • 参照されたオブジェクトを自動的にフォローしてシリアル化します

  • 値のカスタムエンコーダー/デコーダーを追加するためのフックを提供します(日付が最も一般的なケースです)

これにより、複雑なデータ構造の内部保存と転送が少し簡単になります。これをゲームエンジンで使いたいと思っています。ピクルスと同様に、データの逆シリアル化は、クラス定義を提供する元のJavascriptコードなしでは不可能です。

Javascriptにはどのような種類のフレームワークがすでに存在しますか、それともカスタムシステムを展開する必要がありますか?

4

6 に答える 6

4

完全には適合しませんが、occamsrazor.jsを使用してみてください。これを行うと、JSON シリアライゼーションを使用できます。

// this is your costructor function
function Circle(attrs){
    this.radius = attrs.radius;
}
Circle.prototype.area = function (){
    return this.radius*this.radius*Math.PI;
}
Circle.prototype.perimeter = function (){
    return 2*this.radius*Math.PI;
}

// this is a validator
function hasRadius(obj){
    return radius in obj;
}

// this is your factory function
objFactory = occamsrazor().addContructor(hasRadius, Circle);

// this is your deserialized object
var json = '{"radius": 10}';

// circle now is a full fledged object
var circle = objFactory(JSON.parse(json));

欠点は、pickle のようにオブジェクトのスナップショットを取得できず、新しいオブジェクトを再作成することです。しかし、状況によっては便利かもしれません。

于 2013-03-05T08:52:59.027 に答える
4

hunterloftis/cryoを見たいと思うかもしれません。readme から:

node.js およびブラウザー用に構築されています。Cryo は Python の pickle に触発されており、JSON.stringify() および JSON.parse() と同様に機能します。Cryo.stringify() と Cryo.parse() は、次の状況で JSON を改善します。

  • 未定義
  • 日にち
  • 無限大
  • オブジェクト参照
  • 添付プロパティ
  • 機能
  • DOM ノード

r/programmingで著者との短い議論があります。

ソースは簡単で、魔法はありません。

まだ試していません。

于 2013-03-27T13:06:54.090 に答える
1

ここにいくつかあります:

ジェイソン: 完全開示: これは私が作ったものです。しかし、私はそれを使用しており、完全な JavaScript シリアライゼーションのための私の一番の推奨事項です。おそらく、これを使用することで、他のどのライブラリよりも痛みを感じることはほとんどないでしょう。ライブラリがニーズに合わない場合は、ライブラリに追加できることを嬉しく思います! プロトタイプ/コンストラクター情報、同じオブジェクトへの複数の参照には、ユーザー定義型のフックがあります。プロトタイプを「定数」リストに明示的に追加しない限り、プロトタイプのコピーを保存します。この場合、再構築時に既存のプロトタイプが使用されます。JSON スタイルのリプレースと、解析時に存在するオブジェクトを参照する方法があります。Date、RegExp、null、NaN、Infinity、-Infinity、関数、DOM 要素、イベント、および通常のオブジェクトをシリアル化します。まだ試行錯誤されたライブラリではありませんが、うまくいかない場合は、https://github.com/johnlarson/ジェイソン

ResurrectJS: プロトタイプ/コンストラクター情報、同じオブジェクトへの複数の参照、フックなし。「コンストラクター」プロパティを使用してコンストラクターを取得します。コンストラクターの名前空間には特定の制限があり、カスタム名前空間リゾルバーで回避できます。JSON スタイルの置換機能があります。Date、RegExp、DOM Elements、NaN、Infinity、-Infinity、および通常のオブジェクトをシリアル化します。Jason よりも成熟しており、使用方法がテストされていますが、正しく使用するのは困難です。https://github.com/skeeto/resurrect-js

スナップショット: これは試していません。有望に見えますが、最後に更新されたのは 3 年前です。私が知る限り、自動プロトタイプ/コンストラクター情報はありませんが、JSON の toJSON および fromJSON に似たカスタムのシリアライゼーション/デシリアライゼーション動作を定義するためのフック API があります。同じオブジェクトへの複数の参照を処理します。私が知る限り、JSON スタイルのリプレースはありません。Date、RegExp、null、および関数をシリアル化します。https://github.com/mixu/snapshot

JASON: 私が試したことのない別の有望なライブラリは、3 年前に最後に更新されました。プロトタイプ/コンストラクターを実行するかどうかはわかりません。同じオブジェクトへの複数の参照を処理します。私の知る限り、フックはありません。JSON スタイルのリプレースがあるかどうかはわかりません。「日付、正規表現、ブール値など」をシリアル化します。および「未定義を含むすべての JS プリミティブ」。https://github.com/xk/JASON

于 2015-04-23T15:08:50.397 に答える
1

msgpackをチェックしてください。JavaScript オブジェクトには使用していませんが、この例は、JSON だけでなくオブジェクトに対しても機能することを暗示しているようです。追加のボーナス: これは、シリアル化に使用した中で最も高速な実装の 1 つです。

于 2013-03-05T08:28:45.617 に答える