Hướng dẫn serialize and unserialize in javascript - serialize và unserialize trong javascript

Tôi có nhiều đối tượng JavaScript trong ứng dụng của mình, một cái gì đó như:

function Person(age) {
    this.age = age;
    this.isOld = function (){
        return this.age > 60;
    }
}
// before serialize, ok
var p1 = new Person(77);
alert("Is old: " + p1.isOld());

// after, got error Object # has no method 'isOld'
var serialize = JSON.stringify(p1);
var _p1 = JSON.parse(serialize);
alert("Is old: " + _p1.isOld());

Xem trong JS Fiddle.

Câu hỏi của tôi là: Có một thực hành/mẫu/mẹo tốt nhất để khôi phục đối tượng của tôi theo cùng loại trước khi tuần tự hóa (trường hợp của người lớp, trong trường hợp này)?

Yêu cầu mà tôi có:

  • Tối ưu hóa việc sử dụng đĩa: Tôi có một cây lớn trong bộ nhớ. Vì vậy, tôi không muốn lưu trữ các chức năng.
  • Giải pháp có thể sử dụng jQuery và một thư viện khác để tuần tự hóa/unserialize.

Đã hỏi ngày 27 tháng 6 năm 2011 lúc 0:39Jun 27, 2011 at 0:39

Hướng dẫn serialize and unserialize in javascript - serialize và unserialize trong javascript

ToperatoperaTopera

12K15 Huy hiệu vàng66 Huy hiệu bạc101 Huy hiệu đồng15 gold badges66 silver badges101 bronze badges

2

JSON không có chức năng như các loại dữ liệu. Bạn chỉ có thể tuần tự hóa chuỗi, số, đối tượng, mảng và booleans (và

Person.prototype.toJson = function() {
    return JSON.stringify({age: this.age});
};
9)

Bạn có thể tạo phương thức

Person.fromJson = function(json) {
    var data = JSON.parse(json); // Parsing the json string.
    return new Person(data.age);
};
0 của riêng mình, chỉ truyền dữ liệu thực sự phải được tuần tự hóa:

Person.prototype.toJson = function() {
    return JSON.stringify({age: this.age});
};

Tương tự để giải phóng:

Person.fromJson = function(json) {
    var data = JSON.parse(json); // Parsing the json string.
    return new Person(data.age);
};

Việc sử dụng sẽ là:

var serialize = p1.toJson();
var _p1 = Person.fromJson(serialize);
alert("Is old: " + _p1.isOld());

Để giảm số lượng công việc, bạn có thể xem xét để lưu trữ tất cả các dữ liệu cần được tuần tự hóa trong một thuộc tính "dữ liệu" đặc biệt cho mỗi ví dụ

Person.fromJson = function(json) {
    var data = JSON.parse(json); // Parsing the json string.
    return new Person(data.age);
};
1. Ví dụ:

function Person(age) {
    this.data = {
        age: age
    };
    this.isOld = function (){
        return this.data.age > 60 ? true : false;
    }
}

Sau đó, tuần tự hóa và giải phóng hóa chỉ đơn thuần là gọi

Person.fromJson = function(json) {
    var data = JSON.parse(json); // Parsing the json string.
    return new Person(data.age);
};
2 và đặt dữ liệu của một thể hiện sẽ là
Person.fromJson = function(json) {
    var data = JSON.parse(json); // Parsing the json string.
    return new Person(data.age);
};
3.

Điều này sẽ giữ cho các phương thức

Person.fromJson = function(json) {
    var data = JSON.parse(json); // Parsing the json string.
    return new Person(data.age);
};
0 và
Person.fromJson = function(json) {
    var data = JSON.parse(json); // Parsing the json string.
    return new Person(data.age);
};
5 đơn giản nhưng bạn phải điều chỉnh các chức năng khác của mình.


Lưu ý bên:

Bạn nên thêm phương thức

Person.fromJson = function(json) {
    var data = JSON.parse(json); // Parsing the json string.
    return new Person(data.age);
};
6 vào nguyên mẫu của hàm:

Person.prototype.isOld = function() {}

Mặt khác, mọi trường hợp đều có ví dụ riêng của chức năng đó cũng làm tăng bộ nhớ.

Hướng dẫn serialize and unserialize in javascript - serialize và unserialize trong javascript

Flimzy

70.9K15 Huy hiệu vàng133 Huy hiệu bạc171 Huy hiệu đồng15 gold badges133 silver badges171 bronze badges

Đã trả lời ngày 27 tháng 6 năm 2011 lúc 0:47Jun 27, 2011 at 0:47

Hướng dẫn serialize and unserialize in javascript - serialize và unserialize trong javascript

Felix Klingfelix KlingFelix Kling

774K172 Huy hiệu vàng1069 Huy hiệu bạc1116 Huy hiệu đồng172 gold badges1069 silver badges1116 bronze badges

14

Tôi đã viết serialijse vì tôi phải đối mặt với vấn đề tương tự như bạn.serialijse because I faced the same problem as you.

Bạn có thể tìm thấy nó tại https://github.com/erossignon/serialijse

Nó có thể được sử dụng trong NodeJS hoặc trong trình duyệt và có thể phục vụ để tuần tự hóa và giảm dần một tập hợp các đối tượng phức tạp từ một bối cảnh (NODEJS) sang bảng khác (trình duyệt) hoặc ngược lại.

var s = require("serialijse");


var assert = require("assert");


// testing serialization of a simple javascript object with date
function testing_javascript_serialization_object_with_date() {

    var o = {
        date: new Date(),
        name: "foo"
    };
    console.log(o.name, o.date.toISOString());

    // JSON will fail as JSON doesn't preserve dates
    try {
        var jstr = JSON.stringify(o);
        var jo = JSON.parse(jstr);
        console.log(jo.name, jo.date.toISOString());
    } catch (err) {
        console.log(" JSON has failed to preserve Date during stringify/parse ");
        console.log("  and has generated the following error message", err.message);
    }
    console.log("");



    var str = s.serialize(o);
    var so = s.deserialize(str);
    console.log(" However Serialijse knows how to preserve date during serialization/deserialization :");
    console.log(so.name, so.date.toISOString());
    console.log("");
}
testing_javascript_serialization_object_with_date();


// serializing a instance of a class
function testing_javascript_serialization_instance_of_a_class() {

    function Person() {
        this.firstName = "Joe";
        this.lastName = "Doe";
        this.age = 42;
    }

    Person.prototype.fullName = function () {
        return this.firstName + " " + this.lastName;
    };


    // testing serialization using  JSON.stringify/JSON.parse
    var o = new Person();
    console.log(o.fullName(), " age=", o.age);

    try {
        var jstr = JSON.stringify(o);
        var jo = JSON.parse(jstr);
        console.log(jo.fullName(), " age=", jo.age);

    } catch (err) {
        console.log(" JSON has failed to preserve the object class ");
        console.log("  and has generated the following error message", err.message);
    }
    console.log("");

    // now testing serialization using serialijse  serialize/deserialize
    s.declarePersistable(Person);
    var str = s.serialize(o);
    var so = s.deserialize(str);

    console.log(" However Serialijse knows how to preserve object classes serialization/deserialization :");
    console.log(so.fullName(), " age=", so.age);
}
testing_javascript_serialization_instance_of_a_class();


// serializing an object with cyclic dependencies
function testing_javascript_serialization_objects_with_cyclic_dependencies() {

    var Mary = { name: "Mary", friends: [] };
    var Bob = { name: "Bob", friends: [] };

    Mary.friends.push(Bob);
    Bob.friends.push(Mary);

    var group = [ Mary, Bob];
    console.log(group);

    // testing serialization using  JSON.stringify/JSON.parse
    try {
        var jstr = JSON.stringify(group);
        var jo = JSON.parse(jstr);
        console.log(jo);

    } catch (err) {
        console.log(" JSON has failed to manage object with cyclic deps");
        console.log("  and has generated the following error message", err.message);
    }

    // now testing serialization using serialijse  serialize/deserialize
    var str = s.serialize(group);
    var so = s.deserialize(str);
    console.log(" However Serialijse knows to manage object with cyclic deps !");
    console.log(so);
    assert(so[0].friends[0] == so[1]); // Mary's friend is Bob
}
testing_javascript_serialization_objects_with_cyclic_dependencies();

Đã trả lời ngày 24 tháng 10 năm 2014 lúc 6:18Oct 24, 2014 at 6:18

EtienneetienneEtienne

15.2k3 Huy hiệu vàng24 Huy hiệu bạc31 Huy hiệu đồng3 gold badges24 silver badges31 bronze badges

4

Tôi là tác giả của https://github.com/joonhocho/seri.

SERI là hỗ trợ lớp JSON + Custom (lồng nhau).

Bạn chỉ cần cung cấp

Person.fromJson = function(json) {
    var data = JSON.parse(json); // Parsing the json string.
    return new Person(data.age);
};
7 và
Person.fromJson = function(json) {
    var data = JSON.parse(json); // Parsing the json string.
    return new Person(data.age);
};
8 để tuần tự hóa và giải phóng bất kỳ trường hợp lớp nào.

Đây là một ví dụ với các đối tượng lớp lồng nhau:

import seri from 'seri';

class Item {
  static fromJSON = (name) => new Item(name)

  constructor(name) {
    this.name = name;
  }

  toJSON() {
    return this.name;
  }
}

class Bag {
  static fromJSON = (itemsJson) => new Bag(seri.parse(itemsJson))

  constructor(items) {
    this.items = items;
  }

  toJSON() {
    return seri.stringify(this.items);
  }
}

// register classes
seri.addClass(Item);
seri.addClass(Bag);


const bag = new Bag([
  new Item('apple'),
  new Item('orange'),
]);


const bagClone = seri.parse(seri.stringify(bag));


// validate
bagClone instanceof Bag;

bagClone.items[0] instanceof Item;
bagClone.items[0].name === 'apple';

bagClone.items[1] instanceof Item;
bagClone.items[1].name === 'orange';

Hy vọng nó giúp giải quyết vấn đề của bạn.

Đã trả lời ngày 23 tháng 6 năm 2016 lúc 23:27Jun 23, 2016 at 23:27

JoonjoonJoon

8.8465 huy hiệu vàng46 Huy hiệu bạc74 Huy hiệu đồng5 gold badges46 silver badges74 bronze badges

API JSON gốc của trình duyệt có thể không cung cấp cho bạn chức năng IDOLD của bạn sau khi bạn gọi JSON.

var person_json = "{ \"age:\" : 20, \"isOld:\": false, isOld: function() { return this.age > 60; } }";

Sau đó, bạn có thể gọi

eval("(" + person + ")") 

và bạn sẽ lấy lại chức năng của mình trong đối tượng JSON.

Đã trả lời ngày 27 tháng 6 năm 2011 lúc 16:32Jun 27, 2011 at 16:32

T. Webstert. WebsterT. Webster

9.2856 huy hiệu vàng64 Huy hiệu bạc94 Huy hiệu đồng6 gold badges64 silver badges94 bronze badges

Tôi đã có cùng một vấn đề, và viết một công cụ nhỏ để thực hiện trộn lẫn dữ liệu và mô hình. Xem https://github.com/khayll/jsmix

Đây là cách bạn sẽ làm điều đó:

Person.prototype.toJson = function() {
    return JSON.stringify({age: this.age});
};
0

Nó có thể xử lý các đối tượng phức tạp, giống như các bộ sưu tập lồng nhau cũng đệ quy.

Đối với việc tuần tự hóa các chức năng của JS, tôi sẽ không làm điều đó vì lý do bảo mật.

Đã trả lời ngày 6 tháng 9 năm 2015 lúc 22:45Sep 6, 2015 at 22:45

Tôi đã thêm một repo serializer JavaScript khác vào GitHub.

Thay vì thực hiện cách tiếp cận của các đối tượng JavaScript tuần tự hóa và giải phóng sang định dạng nội bộ, cách tiếp cận ở đây là để tuần tự hóa các đối tượng JavaScript ra JavaScript bản địa. Điều này có lợi thế là định dạng hoàn toàn bất khả tri từ chất tuần tự và đối tượng có thể được tái tạo đơn giản bằng cách gọi eval ().

https://github.com/iconico/JavaScript-Serializer

Đã trả lời ngày 9 tháng 1 năm 2019 lúc 1:59Jan 9, 2019 at 1:59

Nico Westerdalenico WesterdaleNico Westerdale

2.0861 Huy hiệu vàng24 Huy hiệu bạc31 Huy hiệu đồng1 gold badge24 silver badges31 bronze badges

Tôi có một vấn đề tương tự và vì tôi không thể tìm thấy một giải pháp đầy đủ, tôi cũng đã tạo một thư viện tuần tự cho javascript: https://github.com/wavesoft/jbb (như một vấn đề thực tế là nó nhiều hơn một chút, vì nó chủ yếu dành cho tài nguyên bó)

Nó gần với nhị phân-json nhưng nó bổ sung một vài tính năng bổ sung, chẳng hạn như siêu dữ liệu cho các đối tượng được mã hóa và một số tối ưu hóa thêm như sao chép dữ liệu, tham chiếu chéo với các gói khác và nén cấp cấu trúc.

Tuy nhiên, có một điều bắt được: để giữ cho kích thước bó nhỏ, không có thông tin loại trong gói. Thông tin như vậy được cung cấp trong một "hồ sơ" riêng biệt mô tả các đối tượng của bạn để mã hóa và giải mã. Vì lý do tối ưu hóa thông tin này được đưa ra dưới dạng kịch bản.

Nhưng bạn có thể làm cho cuộc sống của mình dễ dàng hơn khi sử dụng tiện ích

Person.fromJson = function(json) {
    var data = JSON.parse(json); // Parsing the json string.
    return new Person(data.age);
};
9 (https://github.com/wavesoft/gulp-jbb-profile) để tạo các tập lệnh mã hóa/giải mã từ các thông số kỹ thuật đối tượng YAML đơn giản như thế này:

Person.prototype.toJson = function() {
    return JSON.stringify({age: this.age});
};
1

Ví dụ: bạn có thể có một cái nhìn trên hồ sơ

var serialize = p1.toJson();
var _p1 = Person.fromJson(serialize);
alert("Is old: " + _p1.isOld());
0. Khi bạn đã sẵn sàng hồ sơ của mình, bạn có thể sử dụng JBB như thế này:

Person.prototype.toJson = function() {
    return JSON.stringify({age: this.age});
};
2

Và bạn có thể đọc lại như thế này:

Person.prototype.toJson = function() {
    return JSON.stringify({age: this.age});
};
3

Đã trả lời ngày 1 tháng 6 năm 2016 lúc 23:53Jun 1, 2016 at 23:53

WaveyWaveyWavey

Phù hiệu bằng đồng 3144 bronze badges

Bạn có thể tạo một thể hiện trống của lớp của bạn và gán các giá trị cho nó với

var serialize = p1.toJson();
var _p1 = Person.fromJson(serialize);
alert("Is old: " + _p1.isOld());
1.

Person.prototype.toJson = function() {
    return JSON.stringify({age: this.age});
};
4

Đã trả lời ngày 14 tháng 3 lúc 8:47Mar 14 at 8:47

Tôi đã cố gắng làm điều này với

var serialize = p1.toJson();
var _p1 = Person.fromJson(serialize);
alert("Is old: " + _p1.isOld());
2 với bản địa ____ 33 ...

Person.prototype.toJson = function() {
    return JSON.stringify({age: this.age});
};
5

Điều này nói gì? Nó nói rằng

  • Cần phải có một định danh duy nhất, tốt hơn
    var serialize = p1.toJson();
    var _p1 = Person.fromJson(serialize);
    alert("Is old: " + _p1.isOld());
    
    4, nếu bạn muốn nó an toàn hơn.
Person.prototype.toJson = function() {
    return JSON.stringify({age: this.age});
};
6

Đây là một klass có thể nối tiếp, với

Person.prototype.toJson = function() {
    return JSON.stringify({age: this.age});
};
7

Tôi cũng đã cố gắng làm điều đó với đối tượng kiểu Mongo (

var serialize = p1.toJson();
var _p1 = Person.fromJson(serialize);
alert("Is old: " + _p1.isOld());
5), nhưng nó đã thất bại trong
var serialize = p1.toJson();
var _p1 = Person.fromJson(serialize);
alert("Is old: " + _p1.isOld());
6. Cung cấp
var serialize = p1.toJson();
var _p1 = Person.fromJson(serialize);
alert("Is old: " + _p1.isOld());
7 không còn quan trọng nữa ...

BTW, nếu bạn không quan tâm đến các thư viện, bạn có thể sử dụng

var serialize = p1.toJson();
var _p1 = Person.fromJson(serialize);
alert("Is old: " + _p1.isOld());
8 /
var serialize = p1.toJson();
var _p1 = Person.fromJson(serialize);
alert("Is old: " + _p1.isOld());
9 từ
function Person(age) {
    this.data = {
        age: age
    };
    this.isOld = function (){
        return this.data.age > 60 ? true : false;
    }
}
0. Chỉ cần chắc chắn rằng bạn làm theo cách nguy hiểm.

Đã trả lời ngày 11 tháng 2 năm 2020 lúc 16:56Feb 11, 2020 at 16:56

PolvpolvPolv

1.7541 Huy hiệu vàng17 Huy hiệu bạc31 Huy hiệu đồng1 gold badge17 silver badges31 bronze badges

Tôi đã thực hiện một mô -đun NPM có tên Esserializer để giải quyết vấn đề này: Lưu các giá trị đối tượng lớp JavaScript trong quá trình tuần tự hóa, ở định dạng JSON đơn giản, mà không lưu trữ bất kỳ chức năng nào. Trong quá trình tuần tự hóa, chi phí duy nhất phát sinh là lưu thông tin tên lớp. Do đó, việc sử dụng đĩa được tối ưu hóa.

Sau đó trong giai đoạn giải phóng hóa, Esserializer có thể đệ quy hóa thể hiện đối tượng, với tất cả các loại/chức năng thông tin được giữ lại. Nó hoạt động trong cả môi trường Trình duyệt và Node.js.

Trong trường hợp của OP, mã sẽ khá dễ dàng:

Person.prototype.toJson = function() {
    return JSON.stringify({age: this.age});
};
8

function Person(age) {
    this.data = {
        age: age
    };
    this.isOld = function (){
        return this.data.age > 60 ? true : false;
    }
}
1 là một ví dụ
Person.fromJson = function(json) {
    var data = JSON.parse(json); // Parsing the json string.
    return new Person(data.age);
};
1, chứa tất cả các giá trị/hàm/thông tin siêu cấp.

Ước gì nó có thể giúp.

Đã trả lời ngày 1 tháng 3 năm 2021 lúc 7:05Mar 1, 2021 at 7:05

Shaochuancsshaochuancsshaochuancs

14,5K3 Huy hiệu vàng 50 Huy hiệu bạc60 Huy hiệu Đồng3 gold badges50 silver badges60 bronze badges

Sê -ri hóa và giải phóng hóa trong JavaScript là gì?

Xét nghiệm hóa cấu trúc dữ liệu trong bộ nhớ và chuyển đổi nó thành một loạt các byte có thể được lưu trữ và chuyển giao. Việc giải phóng hóa mất một loạt các byte và chuyển đổi nó thành cấu trúc dữ liệu trong bộ nhớ có thể được tiêu thụ theo chương trình.

Sê -ri trong JavaScript là gì?

Quá trình theo đó một cấu trúc đối tượng hoặc dữ liệu được dịch thành một định dạng phù hợp để chuyển qua mạng hoặc lưu trữ (ví dụ: trong một bộ đệm hoặc định dạng tệp mảng).Ví dụ, trong JavaScript, bạn có thể tuần tự hóa một đối tượng thành chuỗi JSON bằng cách gọi hàm JSON.chuỗi (). (e.g. in an array buffer or file format). In JavaScript, for example, you can serialize an object to a JSON string by calling the function JSON. stringify() .

Sê -ri là gì so với giảm dần là gì?

Tuần tự hóa là quá trình chuyển đổi một đối tượng thành một luồng byte để lưu trữ đối tượng hoặc truyền nó đến bộ nhớ, cơ sở dữ liệu hoặc tệp.Mục đích chính của nó là lưu trạng thái của một đối tượng để có thể tạo lại nó khi cần thiết.Quá trình đảo ngược được gọi là khử deserialization.

Sự dập tắt trong JavaScript là gì?

Quá trình theo đó một định dạng cấp thấp hơn (ví dụ: đã được chuyển qua mạng hoặc được lưu trữ trong một kho lưu trữ dữ liệu) được dịch thành một đối tượng có thể đọc được hoặc cấu trúc dữ liệu khác.Ví dụ, trong JavaScript, bạn có thể giảm bớt chuỗi JSON vào một đối tượng bằng cách gọi hàm JSON.Parse ().. In JavaScript, for example, you can deserialize a JSON string to an object by calling the function JSON. parse() .