【问题标题】:Python-like pickling of full Javascript objects类似 Python 的完整 Javascript 对象的酸洗
【发布时间】:2013-03-04 16:23:40
【问题描述】:

是否有任何 Javascript 序列化框架可以保留类和参考信息,如 Python 泡菜? IE。可以直接获取一个原型继承类实例(不仅仅是类似 JSON 的数据)并像这样序列化它::

 // Somehow add serialization metadata to classes first
 obj = new MyObject();
 obj.referred = new MyObject2();
 pickle = serializer.dump(obj) // Provides byte stream of the serialized object  

序列化器可以处理

  • 在泡菜中编码类信息 - 由于存在不同的 JS 类系统,这应该可以以某种方式自定义

  • 自动跟踪和序列化引用的对象

  • 提供挂钩来为值添加自定义编码器/解码器(日期是最常见的情况)

这将使复杂数据结构的内部存储和传输变得更容易一些。我希望在游戏引擎中使用它。与 pickle 一样,如果没有提供类定义的原始 Javascript 代码,数据的反序列化是不可能的。

已经存在什么样的 JavaScript 框架,或者我需要推出自定义系统?

【问题讨论】:

  • 你最终使用了什么?我正在寻找类似的解决方案...
  • occamsrazor.js(见第一个答案)是最好的恕我直言,虽然只是半自动

标签: javascript python json serialization pickle


【解决方案1】:

它并不完美,但您可以尝试使用 occamsrazor.js 。 这样做你可以使用 JSON 序列化:

// this is your costructor function
function Circle(attrs){
    this.radius = attrs.radius;
}
Circle.prototype.area = function (){
    return this.radius*this.radius*Math.PI;
}
Circle.prototype.perimeter = function (){
    return 2*this.radius*Math.PI;
}

// this is a validator
function hasRadius(obj){
    return radius in obj;
}

// this is your factory function
objFactory = occamsrazor().addContructor(hasRadius, Circle);

// this is your deserialized object
var json = '{"radius": 10}';

// circle now is a full fledged object
var circle = objFactory(JSON.parse(json));

缺点是您不会像使用pickle那样获得对象的快照,而是重新创建一个新对象。但在某些情况下可能会很方便。

【讨论】:

  • 谢谢。如果需要实现这样的系统,最好在 occamrazor.js 之上构建 :)
【解决方案2】:

您可能想查看hunterloftis/cryo。来自自述文件:

专为 node.js 和浏览器构建。 Cryo 的灵感来自 Python 的 pickle,其工作方式类似于 JSON.stringify() 和 JSON.parse()。 Cryo.stringify() 和 Cryo.parse() 在这些情况下改进了 JSON:

  • 未定义
  • 日期
  • 无限
  • 对象引用
  • 附加属性
  • 功能
  • DOM 节点

r/programming 与作者进行了简短的讨论。

来源很简单,没有魔法。

我还没试过。

【讨论】:

    【解决方案3】:

    【讨论】:

    • 不完全是我想要的,但至少有一个很好的代码库可以开始扁平化对象图等等:)
    【解决方案4】:

    查看msgpack。虽然我没有将它用于 JavaScript 对象,但该示例似乎暗示它将适用于对象而不仅仅是 JSON。额外的好处:它是我用于序列化的最快实现之一。

    【讨论】:

    • 我检查了 msgpack,但没有找到完整 Javascript 对象的示例:(
    【解决方案5】:

    这里有一些:

    Jason:完全披露:我做了这个。但我使用它,它是我对完整 javascript 序列化的最高建议。与其他任何一种相比,使用它可能会减轻很多痛苦,如果它不符合您的需求,我会欣喜若狂地添加到库中!原型/构造函数信息,对同一对象的多次引用,具有用户定义类型的挂钩。保存原型的副本,除非您明确地将原型添加到“常量”列表中,在这种情况下,它在重建时使用已经存在的原型。具有 JSON 样式的替换器和引用解析时将存在的对象的方式。序列化 Date、RegExp、null、NaN、Infinity、-Infinity、函数、DOM 元素、事件和普通对象。仍然不是一个久经考验的库,但如果它不适合你,你可以给我发电子邮件,我会尝试修复它。 https://github.com/johnlarson/Jason

    ResurrectJS:原型/构造函数信息,对同一个对象的多次引用,没有钩子。使用 'constructor' 属性来获取构造函数,并且构造函数的命名空间有一定的限制,您可以通过自定义命名空间解析器来解决这些限制。具有 JSON 样式的替换器。序列化 Date、RegExp、DOM 元素、NaN、Infinity、-Infinity 和普通对象。比 Jason 更成熟、更受使用测试,但更难正确使用。 https://github.com/skeeto/resurrect-js

    SnapShot:我没试过这个。它看起来很有希望,但最后一次更新是在 3 年前。据我所知,没有自动原型/构造函数信息,但它有一个钩子 api,用于定义类似于 JSON 的 toJSON 和 fromJSON 的自定义序列化/反序列化行为。处理对同一对象的多个引用。据我所知,没有 JSON 样式的替换器。序列化 Date、RegExp、null 和函数。 https://github.com/mixu/snapshot

    JASON:另一个我没有尝试过的有前途的库,最近一次更新是在 3 年前。我不知道它是否有原型/构造函数。处理对同一对象的多个引用。据我所知,它没有钩子。我不知道它是否有 JSON 样式的替换器。序列化“日期、正则表达式、布尔值等”和“所有 JS 原语,包括未定义的”。 https://github.com/xk/JASON

    【讨论】:

      【解决方案6】:

      js-yaml 带有转储(即dangerousDump)和加载(即dangerousLoad)。我认为大多数语言都实现了 YAML。

      否则,您必须提供 JSON.stringify (replacer) 和 JSON.parse (reviver) 的序列化/反序列化方法。

      我基于 https://github.com/patarapolw/any-serialize 创建了一个库,并测试了 Date、RegExp、Set、Function、Class 构造函数、Infinity、NaN、BigInt、Symbol、Undefined。

      对于自定义类实例,您必须提供操作方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多