تسلسل الكائنات في JavaScript (Node.js): دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

تسلسل الكائنات في JavaScript (Node.js): من JSON إلى التنسيقات الثنائية



التسلسل هو عملية تحويل بنية بيانات معقدة (كائن، مصفوفة، Map، Set) إلى تنسيق يمكن حفظه في ملف، أو إرساله عبر الشبكة، أو إرساله إلى عملية أخرى. في Node.js، يُستخدم التسلسل في كل مكان: من REST API إلى التواصل بين العمليات والتخزين المؤقت. في هذه المقالة، سنستعرض الأدوات والمكتبات الرئيسية للتسلسل في بيئة Node.js، ونقاط قوتها وضعفها.



1. JSON المدمج: المعيار الفعلي



الطريقة الأبسط والأكثر شيوعًا هي استخدام الكائن العام JSON مع الدالتين JSON.stringify() و JSON.parse(). وهو مدعوم أصليًا في Node.js دون الحاجة إلى تثبيت حزم إضافية.



مثال على التسلسل الأساسي:

const user = {  name: 'أليكسي',  age: 30,  roles: ['admin', 'editor'],  metadata: null};

// التسلسل إلى سلسلة نصيةconst jsonString = JSON.stringify(user);console.log(jsonString);// {"name":"أليكسي","age":30,"roles":["admin","editor"],"metadata":null}

// إلغاء التسلسل إلى كائنconst parsedUser = JSON.parse(jsonString);console.log(parsedUser.name); // أليكسي


قيود JSON:

  • لا يدعم الدوال — سيتم حذف دوال الكائن.
  • لا يدعم المراجع الدائرية — سيؤدي إلى خطأ Converting circular structure to JSON.
  • يتجاهل undefined، Symbol، BigInt (الأخير يسبب خطأ).
  • يحول Date إلى سلسلة نصية — لا يتم استعادة كائن Date عند إلغاء التسلسل.


تسلسل مخصص باستخدام replacer:

const data = {  name: 'اختبار',  date: new Date(),  secret: 'لا تحفظ',  nested: { value: 42 }};

const json = JSON.stringify(data, (key, value) => { if (key === 'secret') return undefined; // استبعاد الحقل if (value instanceof Date) return value.toISOString(); // تنسيق التاريخ بشكل صريح return value;}, 2); // تنسيق مع مسافات بادئة

console.log(json);


2. التسلسل عبر Buffer: للبيانات الثنائية



عند الحاجة إلى نقل بيانات ثنائية (صور، ملفات، protobuf)، يتم استخدام الفئة Buffer. في Node.js، تسمح Buffer بتحويل السلاسل النصية والكائنات إلى تنسيق ثنائي والعكس.



مثال مع Buffer و JSON:

const obj = { message: 'مرحبًا بالعالم!' };

// التسلسل إلى JSON، ثم إلى Bufferconst buffer = Buffer.from(JSON.stringify(obj), 'utf-8');console.log(buffer); // <Buffer 7b 22 6d 65 73 73 61 67 65 22 3a 22 d0 9f ...

// العودةconst restored = JSON.parse(buffer.toString('utf-8'));console.log(restored.message); // مرحبًا بالعالم!


تسلسل الأرقام مباشرة في Buffer:

const buf = Buffer.alloc(8);buf.writeInt32LE(255, 0); // كتابة عدد صحيح 32 بتbuf.writeFloatLE(3.14, 4); // كتابة رقم عشري

console.log(buf); // تمثيل ثنائي// القراءةconsole.log(buf.readInt32LE(0)); // 255console.log(buf.readFloatLE(4)); // 3.140000104904175


3. مكتبة flatted: حل للمراجع الدائرية



إذا كان الكائن الخاص بك يحتوي على مراجع دائرية (مثل شجرة DOM أو رسم بياني)، فإن JSON القياسي لن يعمل. مكتبة flatted (من تأليف Andrea Giammarchi) تحل هذه المشكلة.



التثبيت والمثال:

npm install flatted


const { stringify, parse } = require('flatted');

const circularObj = { name: 'دائري' };circularObj.self = circularObj; // مرجع دائري

const json = stringify(circularObj);console.log(json);// {"name":"دائري","self":"$1"}

const restored = parse(json);console.log(restored.name); // دائريconsole.log(restored.self === restored); // true


4. Protocol Buffers (protobuf)

توصيات