تسلسل الكائنات في Node.js: JSON وBuffer وProtobuf

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

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

ابدأ الدورة

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

\n\n

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

\n\n

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

\n

وحدة JSON متاحة في Node.js دون الحاجة إلى تثبيت حزم إضافية. وهي تدعم الطريقتين JSON.stringify() و JSON.parse().

\n\n
const user = {\n  name: 'آنا',\n  age: 28,\n  skills: ['JavaScript', 'Node.js'],\n  active: true\n};\n\n// التسلسل\nconst jsonString = JSON.stringify(user);\nconsole.log(jsonString);\n// {"name":"آنا","age":28,"skills":["JavaScript","Node.js"],"active":true}\n\n// إلغاء التسلسل\nconst parsedUser = JSON.parse(jsonString);\nconsole.log(parsedUser.name); // آنا
\n\n

المزايا:

\n
    \n
  • تنسيق قابل للقراءة البشرية
  • \n
  • دعم مدمج في جميع البيئات
  • \n
  • سهولة التصحيح
  • \n
\n\n

العيوب:

\n
    \n
  • لا يدعم undefined، BigInt، Date (يحول إلى سلسلة نصية)، Map، Set
  • \n
  • أبطأ من التنسيقات الثنائية
  • \n
  • حجم زائد بسبب العناصر النحوية (علامات الاقتباس، الفواصل)
  • \n
\n\n

2. Buffer والتسلسل الثنائي في Node.js

\n

للتطبيقات عالية الأداء (الألعاب، البيانات المالية، إنترنت الأشياء) يتم استخدام التنسيقات الثنائية. في Node.js، توجد وحدة Buffer لهذا الغرض.

\n\n
const buf = Buffer.alloc(8);\nbuf.writeUInt32BE(123456, 0); // كتابة عدد صحيح غير موقع 4 بايت\nbuf.writeUInt32BE(789012, 4); // الرقم الثاني\n\nconsole.log(buf); // <Buffer 00 01 e2 40 00 0c 08 14>\n\n// القراءة\nconst a = buf.readUInt32BE(0); // 123456\nconst b = buf.readUInt32BE(4); // 789012
\n\n

للتسلسل المعقد للكائنات بالتنسيق الثنائي، من الأفضل استخدام مكتبات متخصصة.

\n\n

3. Protocol Buffers (protobuf) — تسلسل ثنائي فعال

\n

مكتبة protobuf.js تسمح بتسلسل الكائنات وفقًا لمخطط موصوف في ملفات .proto. هذا هو المعيار المستخدم في gRPC والعديد من بنى الخدمات المصغرة.

\n\n

التثبيت:

\n
npm install protobufjs
\n\n

مثال على الاستخدام:

\n
const protobuf = require('protobufjs');\n\nprotobuf.load('user.proto').then(root => {\n  const User = root.lookupType('userpackage.User');\n\n  const payload = { id: 1, name: 'إيفان', email: 'ivan@example.com' };\n  \n  // التسلسل\n  const errMsg = User.verify(payload);\n  if (errMsg) throw Error(errMsg);\n  \n  const buffer = User.encode(payload).finish();\n  console.log('المخزن المؤقت الثنائي:', buffer);\n\n  // إلغاء التسلسل\n  const decoded = User.decode(buffer);\n  console.log('تم فك الترميز:', decoded);\n});
\n\n

ملف user.proto:

\n
syntax = "proto3";\npackage userpackage;\nmessage User {\n  int32 id = 1;\n  string name = 2;\n  string email = 3;\n}\n
\n\n

المزايا:

\n
    \n
  • أقصى أداء
  • \n
  • حجم مضغوط (أقل بنسبة 30-50% من JSON)
  • \n
  • كتابة صارمة والتحقق من الصحة
  • \n
  • متعدد المنصات
  • \n
\n\n

العيوب:

\n
    \n
  • يتطلب وصف المخطط (.proto)
  • \n
  • تصحيح أكثر صعوبة (بيانات ثنائية)
  • \n
  • الحاجة إلى مزامنة المخططات بين الخدمات
  • \n
\n\n

4. MessagePack — JSON ثنائي

\n

توصيات