17

たとえば、私はクラスを持っています:

function Test() {
}

Test.prototype = {
    'setTest' : function(test) {
        this.test = test;
    }
}
var test = new Test();
Test.setTest('test');

オブジェクト テストをデータベースに保存したい。オブジェクト テストを文字列にシリアル化する方法は? (メソッド、変数など)

4

6 に答える 6

16

jsonでシンプル

JSON.stringify( test );
于 2012-08-01T13:33:27.103 に答える
9

この場合、あなたが求めている質問に対して、あなたが望むことをする方法は本当にありません. あなたの要求の問題は、「関数を含む、オブジェクトに添付されたすべてのものをシリアル化する」ことにあります。

通常、シリアル化はデータに対してのみ行われます。これは、実行可能ファイルが特定の特性に基づいて特定のマシン用にコンパイルされるという点で、通常はマシン バウンドであるためです。さて、javascript は 1 回書き込むだけでどこでも実行できるため、javascript 関数には javascript インタープリターが必要であると言うのが妥当です。しかし、人々がシリアライザーを作成するときは、すべてのシリアライザーが同じように機能する傾向があるため、データ専用に作成します。この場合、業界標準はオブジェクト データのみのシリアライザーである JSON です。

この時点で役立つ 3 つの解決策があります。

  1. 関数をカプセル化する独自のシリアライザー/デシリアライザーを作成します。すべての JavaScript エンジンがソースにアクセスできるわけではないため、これは注意が必要です。
  2. 復元のたびに特定の新しい初期化された型を生成する独自の再読み込みメカニズムを作成し、型名をシリアル化のプロパティの 1 つとして保存します。このようにして、各変数の初期化によってメソッドが提供され、データとのマージによって完全なオブジェクトが提供されます。
  3. 各関数を文字列として保存し、必要に応じてその場で評価します。これは信じられないほどトリッキーで、エラーが発生しやすいです。非常に壊れやすいため、これが役立つケースは考えられません。ただし、これはオプションであり、見逃すことはできません。

3 は 1 のサブアンサーであることはわかっているので、有用な回答は 2 つしかないと考えてください。

表面的にはこれが Chrome と IE9 で機能することはわかっているため、大多数のユーザーが使用する可能性が高い場所ならどこでも機能するはずです。

var abc = function(thing) { return thing; }
abc.toString();
// gives "function(thing) { return thing; }" on the command line

したがって、実際のメソッドの代わりにメソッドを文字列としてシリアル化することは確かにできますが、複製オブジェクトを作成して、ソース オブジェクトのすべての要素をキャプチャできるようにする必要があります (それらを置き換えるのではなく)。

うまくいけば、これが問題についてもう少し考えるのに役立ち、おそらくメソッドをシリアル化する必要がないことを理解するのに役立ちます(私が知っていることは誰も合理的ではありません)。

于 2012-08-01T14:33:11.777 に答える
3

これを行う最善の方法は、getter に基づいて、属性を持つ JSON オブジェクトを作成する独自の serialize メソッドを作成することです。通常、属性ごとに getter を定義します。したがって、ほとんどの場合に機能するはずです (したがって、クラスごとにシリアル化メソッドを定義する必要はありません)。

function serialize(obj) {
   var serialized = {};

   for(var prop in obj) {
        if (obj.hasOwnProperty(prop) && typeof obj[prop] == 'function') {
           if (/^get.*/.test(prop)) {
               var value = obj[prop]();
               var name = prop.replace('get', '');

               if (typeof value === 'object') {
                   serialized[name] = this.serialize(value);
                   continue;
               }

               serialized[name] = value;
           }
       }
   }

   return serialized;
};

属性値をクラスにリセットするには、次の 2 つのオプションがあります。

  • シリアル化された JSON に基づいて有効なオブジェクト インスタンスを作成する関数をクラスに作成します。
  • unserialize メソッドを作成し、setter を使用して JSON をクラスにマップします。

例:

function unserialize(obj, emptyClass) {
   // Check emptyClass for setters and map the data from obj to it.
   return 'class instance';
}
于 2015-09-19T17:26:22.170 に答える
1

通常、ブラウザ/言語/ライブラリ/などで広くサポートされているJSONを使用してこれを行います。唯一の問題は、JSON が関数をサポートしていないことですが、それらをシリアライズする必要は本当にあるのでしょうか?

于 2012-08-01T13:07:02.387 に答える
0

以前はこれに似た機能をサポートする必要がありました。関数の名前を文字列として保存し、JSONとしてシリアル化することになりました。次に、クライアントに戻ったら、この質問に投稿されているようなヘルパーを使用して関数を実行します。

誰かがこの問題を解決するためのより良い方法を持っているなら、私はそれを見たいです!

于 2012-08-01T13:09:36.083 に答える
-2

I recently had to find a solution for this problem. I'm sure it can be improved upon.

First I created a module for instantiating the "serialisable" object.

function MyObj(serialised){
    this.val = "";
    if(serialised){
        var unserialised = JSON.parse(serialised);
        for (var i in unserialised) {
            this[i] = unserialised[i];
        }
    }
}

MyObj.prototype.myMethod = function () { return this.val;};

module.exports = MyObj;

you of course have to consider error handling and other validations.

于 2015-07-31T21:59:58.473 に答える