将复杂的嵌套用户定义对象序列化为javascript

时间:2018-12-10 03:59:21

标签: javascript json object serialization

我正在处理以下复杂对象:

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

以上对象具有以下内容:

  • 嵌套对象
  • 对对象内许多位置的循环引用(不仅仅是主引用)
  • 用户定义的对象

主要问题:如何将此object转换为string进行存储,以及如何将string解析回{{1 }}照原样使用所有方法和变量?


我尝试过的事情

  • 图书馆
    • Flatted.js
    • Cyro.js
    • JSONfn.js
  • 搜索
    • 现有堆栈溢出问题(似乎没有一个能解决我的问题)
    • Google搜索用户定义对象的序列化(这些对象不能处理循环)

尝试这些之后,我看到所有“解决方案”都处理圆形和嵌套对象,而不是用户定义的对象。

我确实记得尝试过其他两个库,但是没有一个库可以同时处理圆形,嵌套和用户定义的对象。

我最接近的是以下解析:

object

请注意我的对象名称是如何消失的,并且每个{ somearr: [ { somevar: {...}, somecircularvar: pointer }, {...}, ... ], someobj: { someothercircularvar: pointer, // Circular pointer conserved somevar: {...} } } 现在都是默认对象(不是我的本地类定义的对象),并且我的方法都没有保留。

在此先感谢能够解决此问题的人。

1 个答案:

答案 0 :(得分:2)

对,所以这就像您要序列化 object 数据,而不是序列化 class 数据。变量仍然存在,但是关于类的元数据(即方法)并未保留。

一个解决方案可能是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();