类似Python的完整JavaScript对象序列化
有没有什么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 个回答
你可以看看这个链接 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 来判断。
你可以看看 hunterloftis/cryo。在它的说明文档里提到:
这个工具是为node.js和浏览器设计的。Cryo的灵感来源于Python的pickle,它的工作方式和JSON.stringify()以及JSON.parse()类似。Cryo.stringify()和Cryo.parse()在以下情况下比JSON更强大:
- 未定义的值
- 日期
- 无穷大
- 对象引用
- 附加属性
- 函数
- DOM节点
在 r/programming 上有作者的简短讨论。
这个工具的源代码很简单,没有什么复杂的东西。
我还没有尝试过这个工具。
虽然不完全合适,但你可以试试 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 那样获取对象的快照,而是重新创建一个新对象。不过在某些情况下,这可能会很方便。