类似Python的完整JavaScript对象序列化

27 投票
6 回答
9116 浏览
提问于 2025-04-17 17:53

有没有什么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  

这个序列化器可以处理:

  • 把类的信息编码到序列化的数据里——这应该可以根据不同的JavaScript类系统进行定制

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

  • 提供接口,让我们可以为值添加自定义的编码器/解码器(日期是最常见的情况)

这样可以让复杂数据结构的内部存储和传输变得简单一些。我希望在游戏引擎中使用这个。就像pickle一样,没有原始的JavaScript代码提供类定义,数据的反序列化是无法进行的。

目前JavaScript中已经存在什么样的框架,还是说我需要自己开发一个系统?

6 个回答

2

你可以看看这个链接 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 来判断。

4

你可以看看 hunterloftis/cryo。在它的说明文档里提到:

这个工具是为node.js和浏览器设计的。Cryo的灵感来源于Python的pickle,它的工作方式和JSON.stringify()以及JSON.parse()类似。Cryo.stringify()和Cryo.parse()在以下情况下比JSON更强大:

  • 未定义的值
  • 日期
  • 无穷大
  • 对象引用
  • 附加属性
  • 函数
  • DOM节点

r/programming 上有作者的简短讨论。

这个工具的源代码很简单,没有什么复杂的东西。

我还没有尝试过这个工具。

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 那样获取对象的快照,而是重新创建一个新对象。不过在某些情况下,这可能会很方便。

撰写回答