首页 文章

在javascript中将复杂的,嵌套的,用户定义的对象序列化为字符串

提问于
浏览
3

我正在使用以下复杂的对象:

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

上述对象具有以下内容:

  • 嵌套对象

  • 循环引用对象内的许多位置(不仅仅是主要参考)

  • 用户定义的对象


Main Question :如何将 object 转换为 string 进行存储,如何将 string 解析回 object 并使用所有方法和变量?


Things I have Tried

  • 图书馆

  • Flatted.js

  • Cyro.js

  • JSONfn.js

  • 搜索

  • 现有的堆栈溢出问题(似乎没有处理我的怪物)

  • Google搜索用户定义对象的序列化(这些无法处理循环)

在尝试这些之后,我看到所有"solutions"处理循环和嵌套对象,而不是用户定义的对象 .

我确实记得尝试过几个其他的库,但没有一个可以同时处理循环,嵌套和用户定义的对象 .

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

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

注意我的对象名称是如何消失的,每个 __proto__ 现在都是默认对象(不是我的本地类定义的对象),我的方法都没有被保存 .

非常感谢能够解决这个问题的人 .

1 回答

  • 2

    是的,所以's kind of like you'重新序列化对象数据,而不是类数据 . 变量仍然存在,但关于类的元数据(即方法)没有被保留 .

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

相关问题