node.js - Node.js 中多态数组的序列化

标签 node.js serialization polymorphism

我正在寻找一种用于序列化 Javascript 对象的方法,该对象包含不同类的其他几个对象,并带有函数参数。

这是一个简单的测试用例:

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

注意:反/序列化的主要用途(至少在我的例子中)是将复杂的对象移动到远程计算机。例如,我想在我的计算机上构建一个大库,然后将其序列化,放入文件,将文件发送到另一台计算机,在那里反序列化,并拥有完全相同的库。

最佳答案

您需要扩展 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());

这是一个 fiddle :http://jsfiddle.net/cSTT5/

关于node.js - Node.js 中多态数组的序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19422744/

相关文章:

javascript - Nodejs Profiling : What to do with v8. 日志文件

node.js - Electron 中的增删改查

node.js - 垂直和水平缩放 Socket.io - "right"的方法是什么?

java - Wicket:使(启用 CDI 的)页面可序列化时要记住什么?

java - Prevayler 序列化优化

node.js - 适用于 NodeJs 的 Azure 通知中心(注册更新并替换标签)

java - 无法序列化 HashMap

haskell - Rank2Types/RankNTypes 在没有多型变量的情况下是否实用?

c++ - std::vector< base_class * > 使用基类迭代但调用派生类函数

c++ - 用于添加和比较 Integer 和 Fraction 类数据的运算符重载