2013-03-04 28 views
17

Có khung công tác tuần tự hóa nào cho Javascript sẽ giữ lại thông tin lớp học và tham chiếu như là dưa chua Python không? I E. một cách trực tiếp có thể mất một cá thể của lớp kế thừa prototypial (dữ liệu không chỉ JSON-like) và serialize nó thích ::Giống như Python làm đầy các đối tượng Javascript đầy đủ

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

Các serializer có thể chăm sóc thông tin lớp

  • Encoding trong dưa - điều này nên được tùy chỉnh bằng cách nào đó do các hệ thống lớp JS khác nhau tồn tại

  • Tự động theo dõi và sắp xếp từng đối tượng được đề xuất

  • Cung cấp móc để thêm bộ mã hóa tùy chỉnh/bộ giải mã cho các giá trị (ngày là trường hợp phổ biến nhất)

Điều này sẽ làm cho lưu trữ nội bộ và chuyển giao phức tạp cấu trúc dữ liệu một chút dễ dàng hơn. Tôi hy vọng sẽ sử dụng điều này trong một công cụ trò chơi. Giống như với dưa chua, việc deserialization của dữ liệu sẽ không thể có mà không có mã Javascript orignal cung cấp các định nghĩa lớp.

Loại khung như vậy tồn tại cho Javascript đã tồn tại hoặc tôi sẽ cần phải triển khai hệ thống tùy chỉnh?

+0

Bạn đã sử dụng kết thúc bằng cách nào? Tôi đang tìm một giải pháp tương tự ... –

+0

occamsrazor.js (xem câu trả lời đầu tiên) là IMHO tốt nhất, mặc dù chỉ bán tự động –

Trả lời

4

Nó không phù hợp hoàn hảo nhưng bạn có thể thử sử dụng occamsrazor.js. Việc làm này bạn có thể sử dụng JSON serialization:

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

Nhược điểm là bạn không nhận được một bản chụp của một đối tượng như sử dụng dưa, bạn tạo một đối tượng mới. Nhưng nó có thể thuận tiện trong một số trường hợp.

+0

Cảm ơn. Nếu người ta cần triển khai hệ thống như vậy thì tốt nhất là xây dựng trên đỉnh của occamrazor.js :) –

1

Khám phá msgpack. Mặc dù tôi đã không sử dụng nó cho các đối tượng JavaScript, ví dụ này dường như ngụ ý rằng nó sẽ làm việc cho các đối tượng chứ không phải chỉ các JSON. Một tiền thưởng thêm: đó là một trong những triển khai nhanh nhất mà tôi từng sử dụng để tuần tự hóa.

+0

Tôi đã kiểm tra msgpack và tôi không tìm thấy ví dụ cho các đối tượng Javascript đầy đủ :( –

1

http://nanodeath.github.com/HydrateJS/ (bài viết blog tại http://blog.maxaller.name/2011/01/hydratejs-smarter-javascript-serialization) dường như để phù hợp với một số yêu cầu của bạn, đánh giá đặc biệt bởi https://github.com/nanodeath/HydrateJS/blob/master/spec/HydrateSpec.js

+0

Không chính xác tôi đang tìm kiếm, nhưng ít nhất có một codebase tốt để bắt đầu làm việc flatting đồ thị đối tượng và vân vân :) –

2

Bạn có thể muốn nhìn vào hunterloftis/cryo. Từ readme:

Được xây dựng cho node.js và trình duyệt. Cryo được lấy cảm hứng từ dưa chua của Python và hoạt động tương tự như JSON.stringify() và JSON.parse(). Cryo.stringify() và Cryo.phân tích cú pháp() cải thiện về JSON trong những trường hợp:

  • Undefined
  • ngày
  • Infinity
  • Object tài liệu tham khảo
  • tài sản gắn liền
  • Chức năng
  • DOM Nodes

Có một cuộc thảo luận ngắn gọn với tác giả tại r/programming.

Nguồn là đơn giản, không có phép thuật.

Tôi chưa thử.

1

Đây là một số ít:

Jason: Tiết lộ đầy đủ: Tôi đã thực hiện việc này. Nhưng tôi sử dụng nó, và nó là khuyến nghị hàng đầu của tôi cho serialization hoàn chỉnh javascript. Có thể bạn sẽ cảm thấy ít đau hơn bằng cách sử dụng cái này hơn bất kỳ cái nào khác, và tôi sẽ ngây ngất khi bổ sung vào thư viện nếu nó không phù hợp với nhu cầu của bạn! Thông tin nguyên mẫu/hàm tạo, nhiều tham chiếu đến cùng một đối tượng, có các móc cho các kiểu do người dùng định nghĩa. Lưu bản sao của nguyên mẫu trừ khi bạn thêm một cách rõ ràng nguyên mẫu vào danh sách 'hằng số', trong trường hợp đó, nó sử dụng nguyên mẫu đã tồn tại khi xây dựng lại. Có trình thay thế kiểu JSON và cách tham chiếu các đối tượng sẽ tồn tại tại thời điểm phân tích cú pháp. Serializes Date, RegExp, null, NaN, Infinity, -Infinity, hàm, DOM Element, Event và các đối tượng bình thường. Vẫn không phải là một thư viện đã được thử nghiệm và thử nghiệm, nhưng nếu nó không hoạt động cho bạn, bạn có thể gửi email cho tôi và tôi sẽ cố gắng sửa nó. https://github.com/johnlarson/Jason

ResurrectJS: Thông tin về nguyên mẫu/hàm tạo, nhiều tham chiếu đến cùng một đối tượng, không có móc. Sử dụng thuộc tính 'constructor' để có được hàm tạo, và có một số hạn chế nhất định với các không gian tên của các hàm tạo, mà bạn có thể thực hiện với trình phân giải không gian tên tùy chỉnh. Có trình thay thế kiểu JSON. Nối tiếp ngày, RegExp, DOM Elements, NaN, Infinity, -Infinity và các đối tượng bình thường. Trưởng thành hơn và được kiểm tra bằng cách sử dụng nhiều hơn Jason, nhưng khó sử dụng hơn. https://github.com/skeeto/resurrect-js

SnapShot: Tôi chưa thử cái này. Có vẻ đầy hứa hẹn nhưng đã được cập nhật lần cuối 3 năm trước. Không có thông tin về prototype/constructor tự động, theo như tôi có thể nói, nhưng nó có một api hook để xác định hành vi serialization/deserialization tùy chỉnh tương tự như JSON's toJSON và fromJSON. Xử lý nhiều tham chiếu đến cùng một đối tượng. Không có trình thay thế kiểu JSON, theo như tôi có thể nói. Serializes Date, RegExp, null và hàm. https://github.com/mixu/snapshot

JASON: Một thư viện đầy hứa hẹn khác mà tôi chưa thử được cập nhật lần cuối 3 năm trước. Tôi không biết liệu nó có nguyên mẫu/nhà xây dựng hay không. Xử lý nhiều tham chiếu đến cùng một đối tượng. Theo như tôi biết, nó không có móc. Tôi không biết liệu nó có trình thay thế kiểu JSON hay không. Serializes 'Ngày, RegExps, Booleans, vv' và 'tất cả JS nguyên thủy, bao gồm cả undefined'. https://github.com/xk/JASON

Các vấn đề liên quan