تسلسل الكائنات في Go (Golang): JSON، XML، Gob و Protocol Buffers

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

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

ابدأ الدورة

تسلسل الكائنات في Go (Golang): من JSON إلى Protobuf

\n\n

التسلسل هو عملية تحويل بنية البيانات (كائن، شريحة، خريطة) إلى سلسلة من البايتات للحفظ في ملف، النقل عبر الشبكة أو التخزين المؤقت. العملية العكسية هي إلغاء التسلسل. في Go (Golang) يتم حل هذه المهمة باستخدام الحزم المدمجة والمكتبات الخارجية. يعتمد اختيار الأداة على متطلبات السرعة، حجم البيانات، قابلية القراءة والتوافق مع اللغات الأخرى.

\n\n

1. الحزمة المدمجة encoding/json

\n\n

الطريقة الأكثر شيوعًا للتسلسل في Go. JSON هو تنسيق قابل للقراءة البشرية ومتعدد المنصات. توفر الحزمة encoding/json الدوال Marshal و Unmarshal.

\n\n
package main\n\nimport (\n    "encoding/json"\n    "fmt"\n    "log"\n)\n\ntype User struct {\n    ID    int    `json:"id"`\n    Name  string `json:"name"`\n    Email string `json:"email,omitempty"`\n}\n\nfunc main() {\n    user := User{ID: 1, Name: "Alice", Email: "alice@example.com"}\n\n    // التسلسل\n    jsonData, err := json.Marshal(user)\n    if err != nil {\n        log.Fatal(err)\n    }\n    fmt.Println(string(jsonData)) // {"id":1,"name":"Alice","email":"alice@example.com"}\n\n    // إلغاء التسلسل\n    var decoded User\n    err = json.Unmarshal(jsonData, &decoded)\n    if err != nil {\n        log.Fatal(err)\n    }\n    fmt.Printf("%+v\\n", decoded)\n}
\n\n

الميزات:

\n
    \n
  • دعم وسوم البنية لتخصيص أسماء الحقول.
  • \n
  • يعمل مع الشرائح، الخرائط، والبنى المتداخلة.
  • \n
  • أبطأ من التنسيقات الثنائية ولكنه مناسب للتصحيح.
  • \n
  • لا يدعم المراجع الدائرية.
  • \n
\n\n

2. encoding/xml — تسلسل XML

\n\n

يستخدم XML في SOAP، RSS، وملفات التكوين. تعمل الحزمة encoding/xml بشكل مشابه لـ JSON ولكن مع وسوم xml.

\n\n
type Book struct {\n    Title  string `xml:"title"`\n    Author string `xml:"author"`\n    Pages  int    `xml:"pages,attr"`\n}\n\nfunc main() {\n    book := Book{Title: "Go in Action", Author: "William Kennedy", Pages: 500}\n    xmlData, _ := xml.MarshalIndent(book, "", "  ")\n    fmt.Println(string(xmlData))\n    // <Book pages="500">\n    //   <title>Go in Action</title>\n    //   <author>William Kennedy</author>\n    // </Book>\n}
\n\n

متى تستخدم:

\n
    \n
  • التكامل مع الأنظمة القديمة.
  • \n
  • المخططات الصارمة (XSD).
  • \n
  • البيانات الموجهة للمستندات.
  • \n
\n\n

3. encoding/gob — التنسيق الثنائي الأصلي لـ Go

\n\n

تم إنشاء الحزمة encoding/gob خصيصًا لـ Go. تقوم بتشفير البيانات بكفاءة إلى تنسيق ثنائي، وتدعم الأنواع المعقدة (الواجهات، القنوات، الدوال - مع قيود).

\n\n
import "encoding/gob"\n\ntype Task struct {\n    ID     int\n    Status string\n}\n\nfunc main() {\n    var network bytes.Buffer\n    enc := gob.NewEncoder(&network)\n    dec := gob.NewDecoder(&network)\n\n    task := Task{ID: 42, Status: "done"}\n    err := enc.Encode(task)\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    var restored Task\n    err = dec.Decode(&restored)\n    fmt.Println(restored) // {42 done}\n}
\n\n

المزايا:

\n
    \n
  • سرعة عالية وصغر الحجم.
  • \n
  • تسجيل الأنواع تلقائيًا.
  • \n
  • دعم الهياكل الدائرية.
  • \n
\n\n

العيب: عدم التوافق مع اللغات الأخرى.

\n\n

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

\n\n

طورته Google. يتطلب تعريف المخطط في ملف .proto وتوليد الكود عبر protoc. المكتبة google.golang.org/protobuf هي المعيار الحديث.

\n\n
// user.proto\n// syntax = "proto3";\n// message User {\n//   int32 id = 1;\n//   string name =                    

توصيات