📜  序列化与反序列化 (1)

📅  最后修改于: 2023-12-03 14:54:09.026000             🧑  作者: Mango

序列化与反序列化

序列化与反序列化是在程序设计中常见操作,用于将数据结构或对象转换为可传输或可存储的格式,并在需要的时候将其还原为原来的形式。

以下是常见的序列化与反序列化方式:

JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。在序列化时,将对象转换为 JSON 格式;在反序列化时,则是将 JSON 格式的数据转换为 JavaScript 对象。JSON 格式的数据可读性强,易于与其他编程语言互操作。

序列化
const data = { name: "Tom", age: 28 };
const jsonStr = JSON.stringify(data);
console.log(jsonStr); // {"name":"Tom","age":28}
反序列化
const jsonStr = '{"name":"Tom","age":28}';
const data = JSON.parse(jsonStr);
console.log(data); // { name: 'Tom', age: 28 }
XML

XML(Extensible Markup Language)是一种标记语言,可以用于表示数据结构,并且可扩展性强。在序列化时,将对象转换为 XML 格式;在反序列化时,则是将 XML 格式的数据转换为对象。

序列化
const data = { name: "Tom", age: 28 };
const xmlStr = new XMLSerializer().serializeToString({data});
console.log(xmlStr); // <data><name>Tom</name><age>28</age></data>
反序列化
const xmlStr = '<data><name>Tom</name><age>28</age></data>';
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlStr, "text/xml");
const name = xmlDoc.getElementsByTagName("name")[0].childNodes[0].nodeValue;
const age = xmlDoc.getElementsByTagName("age")[0].childNodes[0].nodeValue;
console.log({ name, age }); // { name: "Tom", age: "28" }
Protobuf

Protobuf(Protocol Buffers)是一种高效的序列化协议,由 Google 公司开发。在序列化时,将对象转换为二进制格式;在反序列化时,则是将二进制格式的数据转换为对象。Protobuf 支持多种编程语言,可用于不同平台的数据交换。

序列化
// 定义 message
message Person {
  string name = 1;
  int32 age = 2;
}

// 序列化
const person = { name: "Tom", age: 28 };
const buffer = Person.encode(person).finish();
console.log(buffer); // Uint8Array(9) [ 10, 3, 84, 111, 109, 16, 28 ]
反序列化
// 反序列化
const buffer = new Uint8Array([ 10, 3, 84, 111, 109, 16, 28 ]);
const person = Person.decode(buffer);
console.log(person); // { name: "Tom", age: 28 }
总结

序列化与反序列化是数据交换或存储中的重要操作,常见的方式包括 JSON、XML 和 Protobuf。根据不同的场景需求,选择合适的序列化方式,能够提高程序的可维护性、互操作性和可扩展性。