2013-03-04 71 views
17

是否有任何可以保留类似Python pickles的类和参考信息的JavaScript序列化框架?即人们可以直接坐prototypial继承的类实例(只是类JSON不是数据)和序列化它像::完全Javascript对象的类似Python的酸洗

// 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 

串行器可在泡菜采取

  • Encoding类信息护理 - 这应该是某种方式定制的,由于存在不同的JS类系统

  • 自动跟踪和序列化对象所指

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

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

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

+0

你最终使用了什么?我正在寻找类似的解决方案... – 2014-01-27 16:27:05

+0

occamsrazor.js(查看第一个答案)是最好的恕我直言,虽然只有半自动 – 2014-01-27 20:33:49

回答

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)); 

的缺点是,你没有得到像使用泡菜对象的快照,重新创建一个新的对象。但在某些情况下可能会很方便。

+0

谢谢。如果需要实现这样的系统,最好在occamrazor.js的顶部构建:) – 2013-03-05 13:58:39

1

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

+0

我检查了msgpack,但没有找到完整的Javascript对象的例子:( – 2013-03-05 13:38:53

2

特别是判断你可能想看看hunterloftis/cryo。自述文件:

为node.js和浏览器构建。 Cryo灵感来源于Python的pickle,与JSON.stringify()和JSON.parse()类似。 Cryo.stringify()和Cryo。解析()在这种情况下JSON的改善:

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

作者在r/programming有一个简短的讨论。

来源很简单,没有魔法。

我还没试过呢。

1

下面是几个:

杰森:完全披露:我做了这一个。但我使用它,这是我对完整的JavaScript序列化的首选建议。使用这一个比其他任何人都要少得多,如果它不适合你的需要,我会欣喜若狂地为图书馆增添新的内容!原型/构造函数信息,对同一对象的多个引用,具有用户定义类型的钩子。保存原型的副本,除非您明确将原型添加到“常量”列表中,在这种情况下,它将在重建时使用已有的原型。有解析时存在的JSON样式替换器和引用对象的方法。 Serialize Date,RegExp,null,NaN,Infinity,-Infinity,函数,DOM Element,Event和常规对象。仍然不是一个久经考验的图书馆,但如果它不适合你,你可以给我发电子邮件,我会尝试修复它。 https://github.com/johnlarson/Jason

ResurrectJS:原型/构造函数信息,对同一对象的多个引用,没有挂钩。使用'构造函数'属性来获取构造函数,并且构造函数的名称空间有一定的限制,您可以使用自定义名称空间解析器来解决这个问题。有JSON风格的替代品。序列化日期,RegExp,DOM元素,NaN,Infinity,-Infinity和普通对象。使用比Jason更成熟,更经过测试,但难以正确使用。 https://github.com/skeeto/resurrect-js

SnapShot:我还没有试过这个。它看起来很有希望,但最近3年前更新了。据我所知,没有自动原型/构造函数信息,但它具有用于定义类似于JSON toJSON和fromJSON的自定义序列化/反序列化行为的hook api。处理对同一对象的多个引用。据我所知,没有JSON风格的替代品。序列化日期,RegExp,空值和函数。 https://github.com/mixu/snapshot

JASON:另一个有前途的图书馆,我没有尝试过,最近3年前更新过。我不知道它是不是原型/构造函数。处理对同一对象的多个引用。据我所知,它没有钩子。我不知道它是否有JSON风格的替代品。序列化'日期,RegExps,布尔等等'和'所有JS原语,包括未定义'。 https://github.com/xk/JASON