2

次のように、WinJS.Class から作成されたオブジェクトをシリアル化して保存しています。

var myClass = WinJS.Class.define(...);
var myObject = new myClass();
var serialized = JSON.stringify(myObject);
//store the object

そして後で、オブジェクトをストレージから引き出して、それを逆シリアル化してmyClass. それは WinJS でそのまま使用できますか、それともオブジェクトを新しいオブジェクトに変換できるクラスのコンストラクターを作成する必要がありますか?

私はまだ TypeScript に侵入していません。この状況ではそれが役立つと思いますが、それまではプレーンな JavaScript/WinJS でそれを行う方法を考えています。

4

5 に答える 5

1

これを処理する方法はいくつかありますが、WinJS にとって特に特別なものはありません。簡単に言えば、JSON シリアライゼーションはオブジェクトの値のみをシリアライズおよびデシリアライズし、メソッド、プロトタイプ、またはその他の型情報はシリアライズおよびデシリアライズしません。

オプション 1: 値をクラスの新しいインスタンスにコピーする これは通常、コンストラクターに逆シリアル化されたオブジェクトをパラメーターとして取り、データを新しいインスタンスにコピーすることで実現できます。

これにはさまざまなバリエーションがあります。通常、オブジェクト コンストラクターを使用すると、JS エンジンがより多くの最適化をオブジェクトに適用できるため、パフォーマンスが向上します。

ここでは WinJS.UI.setOptions が役立ちます。または、次のような単純なループを使用してデータをコピーすることもできます。

var keys = Object.keys(source);
for (var i = 0, len = keys.length; i < len; i++) {
    var key = keys[i];
    destination[key] = source[key];
}

オプション 2: __proto__ の設定 警告: これはパフォーマンスに重大な悪影響を与える可能性があるため、状況によっては適切ではありません。でもたまには便利かも。

Object.setPrototypeOf(myObject, myClass.prototype);

setPrototypeOf は比較的新しいことに注意してください。Webアプリ用のWin8.1(これについてだと思います)とIE 11にはありますが、たとえばSafariでは利用できません。古いブラウザー/Safari では、 protoへの割り当ては同等です (ただし、可能な場合は setPrototypeOf の方が優れています)。

これにより、myClass のメソッドがオブジェクトにアタッチされますが、パフォーマンスへの悪影響に加えて、オブジェクトでコンストラクターが実行されないため、最初にシリアル化したオブジェクトとまったく同じ状態にならない可能性があります。

その他の役立つこと: JSON の「リバイバー」 JSON.parse は、「リバイバー」と呼ばれるオプションの 2 番目のパラメーターを取ります。これにより、逆シリアル化される JSON の各ノードを変換する機会を得る関数を提供できます。これは、たとえば、シリアル化された日付を JavaScript の Date オブジェクトにリハイドレートするのに役立ちます。また、最上位のオブジェクトを変換する機会も得られます。これは、場合によっては、逆シリアル化されたオブジェクトを必要な「クラス」に変換するのに役立ちます。

于 2015-04-26T23:56:57.223 に答える
0

Javascript は動的言語なので、逆シリアル化されたオブジェクトをキャストする必要はないと思います。それを myClass 型として扱うだけで十分です。お役に立てば幸いです。

于 2013-05-28T20:39:11.800 に答える
-2

You should just be able to call JSON.parse after pulling it out of local storage:

var myObject2; myObject2 = JSON.parse(localStorage["mySeriazliedObject"];

于 2013-01-21T02:17:40.323 に答える