簡體   English   中英

在javascript中將復雜的,嵌套的,用戶定義的對象序列化為字符串

[英]Serializing a complex, nested, user-defined object into a string in javascript

我正在使用以下復雜的對象:

ObjectA {
    somearr: [
        ObjectB {
           somevar: ObjectD {...},
           somecircularvar: pointer
        },
        ObjectC {...},
        ...
    ],
    someobj: ObjectE {
        someothercircularvar: pointer,
        somevar: ObjectF {...}
    },
    someMethod: ...
}

上述目標如下:

  • 嵌套對象
  • 對對象內許多位置的循環引用(不僅僅是主要參考)
  • 用戶定義的對象

主要問題 :如何將此object轉換為string以進行存儲,以及如何使用所有方法和變量將string解析回object


我試過的事情

  • 圖書館
    • Flatted.js
    • Cyro.js
    • JSONfn.js
  • 搜索
    • 現有的堆棧溢出問題(似乎沒有處理我的怪物)
    • Google搜索用戶定義對象的序列化(這些無法處理循環)

在嘗試這些之后,我看到所有“解決方案”都處理循環和嵌套對象, 而不是用戶定義的對象

我確實記得嘗試過其他幾個庫,但沒有一個可以同時處理循環,嵌套和用戶定義的對象。

我得到的最接近的是以下解析:

{
    somearr: [
        {
           somevar: {...},
           somecircularvar: pointer
        },
        {...},
        ...
    ],
    someobj: {
        someothercircularvar: pointer, // Circular pointer conserved
        somevar: {...}
    }
}

注意我的對象名稱是如何消失的,每個__proto__現在都是默認對象(不是我的本地類定義的對象),我的方法都沒有被保存。

非常感謝能夠解決這個問題的人。

是的,所以有點像你在序列化對象數據,而不是數據。 變量仍然存在,但關於類的元數據(即方法 )沒有被保留。

一種解決方案可能是serialijse

serialijse是一個簡單的JavaScript持久性框架,它克服了JSON持久性的兩個主要限制:

  • serialijse處理循環對象。
  • serialijse在反序列化時保留對象類。

他們的第三個例子說明你的情況

// serializing an object with cyclic dependencies
function testing_javascript_serialization_objects_with_cyclic_dependencies() {

    var Mary = { name: "Mary", friends: [] };
    var Bob = { name: "Bob", friends: [] };

    Mary.friends.push(Bob);
    Bob.friends.push(Mary);

    var group = [ Mary, Bob];
    console.log(group);

    // testing serialization using  JSON.stringify/JSON.parse
    try {
        var jstr = JSON.stringify(group);
        var jo = JSON.parse(jstr);
        console.log(jo);

    } catch (err) {
        console.log(" JSON has failed to manage object with cyclic deps");
        console.log("  and has generated the following error message", err.message);
    }

    // now testing serialization using serialijse  serialize/deserialize
    var str = s.serialize(group);
    var so = s.deserialize(str);
    console.log(" However Serialijse knows to manage object with cyclic deps !");
    console.log(so);
    assert(so[0].friends[0] == so[1]); // Mary's friend is Bob
}
testing_javascript_serialization_objects_with_cyclic_dependencies();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM