在node.js中对多态数组进行序列化

我正在寻找一个JavaScript对象的序列化方法,其中包含几个不同类的其他对象与函数参数。

这是一个简单的testing案例:

// Paper class: function Paper(name) { this.name = name; } Paper.prototype = { string: function() { return "Paper:"+this.name; } }; // Book class: function Book(name) { this.name = name; } Book.prototype = { string: function() { return "Book:"+this.name; } }; // Library class: function Library(name) { this.items = []; } Library.prototype = { add: function(item) { this.items.push(item); }, string: function () { var titles = this.items.map(function(item) { return item.string(); }); return titles.join(","); }, }; ///// Define a library: var lib = new Library(); lib.add(new Paper("MyPaper")); lib.add(new Book("MyBook")); assert(lib.string() == "Paper:MyPaper,Book:MyBook"); ///// Serialize, de-serialize and compare: // var libString = serialize(lib); // var newLib = deserialize(libString); // assert(newLib.string() == "Paper:MyPaper,Book:MyBook"); 

注意:de / serialization的主要用法(至less在我的情况下)是将复杂的对象移动到远处的计算机上。 例如,我想在我的计算机上build立一个大型图书馆,然后将其序列化,放置一个文件,将文件发送到另一台计算机,在那里反序列化,并具有完全相同的库。

您需要扩展JSON语义。 如果我是你,我会这样的:

 var protos = {}, //hash of prototypes base = { //base prototype toJSON: function () { var props = {}; //properties to be serialized for (var prop in this) { //this can be custimized, like taking `attrs` hash or something if (this.hasOwnProperty(prop)) props[prop] = this[prop]; } props.$proto = this.$proto; //need to copy this manually since it's not an `own propery` return props; } }; function Paper(name) { this.name = name; } protos.paper = Paper.prototype = Object.create(base); Paper.prototype.$proto = 'paper'; Paper.prototype.toString = function() { return 'Paper: ' + this.name; } function Book(name) { this.name = name; } protos.book = Book.prototype = Object.create(base); Book.prototype.$proto = 'book'; Book.prototype.toString = function() { return 'Book: ' + this.name; } function Library(name) { this.items = []; } Library.prototype = { add: function(item) { this.items.push(item); }, toString: function () { var titles = this.items.map(function(item) { return item.toString(); }); return titles.join(','); }, toJSON: function () { return this.items.map(function(item) { return item.toJSON()}); } }; Library.fromJSON = function (json) { return json.map(function(item) { var object = Object.create(protos[item.$proto]); for (var prop in item) object[prop] = item[prop]; return object; }); }; //test var lib = new Library(); lib.add(new Paper('MyPaper')); lib.add(new Book('MyBook')); console.log(lib.toString()); var json = JSON.stringify(lib.toJSON()); console.log(Library.fromJSON(JSON.parse(json)).toString()); 

这是一个小提琴: http : //jsfiddle.net/cSTT5/

Interesting Posts