完整Javascript对象的类似python的pickle

Python-like pickling of full Javascript objects

本文关键字:python pickle 对象 完整 Javascript      更新时间:2023-09-26

Javascript是否有任何序列化框架可以像Python pickle那样保留类和引用信息?也就是说,可以直接取一个继承类实例的原型(不只是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  

序列化器可以处理

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

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

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

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

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

它不完全适合,但你可以尝试使用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那样获得对象的快照,而是重新创建一个新对象。但在某些情况下,它可能很方便。

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

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

  • 定义
  • 无限
  • 对象引用
  • 附加属性
  • <
  • DOM节点/gh>

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

来源很简单,没有魔法。

我还没试过。

http://nanodeath.github.com/HydrateJS/(博客文章在http://blog.maxaller.name/2011/01/hydratejs-smarter-javascript-serialization)似乎符合您的一些要求,特别是通过https://github.com/nanodeath/HydrateJS/blob/master/spec/HydrateSpec.js

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

以下是一些:

杰森:完全披露:这是我做的。但我使用它,它是我最推荐的完整javascript序列化。使用这个库可能会比使用其他库少很多痛苦,如果它不能满足您的需求,我很乐意对库进行添加!原型/构造函数信息,对同一对象的多个引用,具有用于用户定义类型的钩子。保存原型的副本,除非你显式地将原型添加到"常量"列表中,在这种情况下,它在重建时使用已经存在的原型。具有json风格的替换器和引用对象的方法,这些对象将在解析时存在。序列化日期、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风格的替代品。序列化日期、RegExp、null和函数。https://github.com/mixu/snapshot

JASON:另一个很有前途的库,我没有尝试过,上次更新是在3年前。我不知道它是否有原型/构造器。处理对同一对象的多个引用。据我所知,它没有钩子。我不知道它是否有json风格的替换。序列化"日期、regexp、布尔值等"answers"所有JS原语,包括undefined"。https://github.com/xk/JASON

js-yaml with dump(即dangerousDump)和load(即dangerousLoad)。我认为大多数语言都实现了YAML。

否则,您必须提供如何序列化/反序列化JSON。stringify (replacer)和JSON。解析(兴奋剂)。

我做了一个基于https://github.com/patarapolw/any-serialize的库,并测试了日期,RegExp, Set,函数,类构造函数,Infinity, NaN, BigInt, Symbol, Undefined。

对于自定义Class实例,您必须提供how-to。