24

是否有任何 Javascript 序列化框架可以保留类和参考信息,如 Python 泡菜?即,可以直接获取一个原型继承类实例(不仅仅是类似 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 已经存在什么样的此类框架,或者我将需要推出自定义系统?

4

6 回答 6

4

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

于 2013-03-05T08:52:59.027 回答
4

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

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

  • 不明确的
  • 日期
  • 无穷
  • 对象引用
  • 附加属性
  • 职能
  • DOM 节点

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

来源很简单,没有魔法。

我还没试过。

于 2013-03-27T13:06:54.090 回答
2

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

于 2013-03-12T20:56:18.237 回答
1

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

于 2013-03-05T08:28:45.617 回答
1

这里有几个:

杰森:完全披露:我做了这个。但我使用它,它是我对完整 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

于 2015-04-23T15:08:50.397 回答
1

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

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

I made a library based that that https://github.com/patarapolw/any-serialize, and tested for Date, RegExp, Set, Function, Class constructor, Infinity, NaN, BigInt, Symbol, Undefined.

For custom Class instances, you will have to provide how-to.

于 2020-02-22T15:52:01.937 回答