2013-10-17 3 views
1

다른 클래스의 몇 가지 다른 객체가 포함 된 Javascript 객체의 직렬화 메소드를 찾고 있습니다. 함수 인수가 있습니다.node.js의 다형성 배열의 직렬화

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

참고 : 드/직렬화 (적어도 내 경우) 멀리 떨어져있는 컴퓨터에 복잡한 객체를 이동하는 것입니다의 주요 사용 여기

은 간단한 테스트 케이스입니다. 예를 들어, 내 컴퓨터에 큰 라이브러리를 만들고 직렬화하고, 파일을 저장하고, 다른 컴퓨터에 파일을 보내고, 역 직렬화하고, 동일한 라이브러리를 갖고 싶습니다.

답변

1

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/

+0

이 유망 보이지만,이 작품은 또한 직렬화 된 문자열이 다른 컴퓨터로 이동합니다한다면? 이것은 필자의 경우에 가장 중요한 사용 사례이다. 내 컴퓨터에 큰 라이브러리를 만들고 직렬화하고, 파일을 저장하고, 다른 컴퓨터에 파일을 보내고, 역 직렬화하고, 동일한 라이브러리를 가지고있다. 하지만, 귀하의 제안은 다른 컴퓨터에서 사용할 수없는 전역 변수 "protos"에 의존하는 것 같습니다 ... –

+0

맞습니다. 모든 프로토 타입은 비 직렬화 파티에서 사용할 수 있어야합니다. 그러나 공정하게 나는 이것이 어떻게 문제인지를 볼 수 없다. 어쩌면 내가 다른 해결책을 제시 할 수있는 경우에 대한 자세한 내용을 제공 할 수 있습니다. – vkurchatkin

+0

맞습니다. 내일 더 자세한 예제를 작성하겠습니다. –

관련 문제