تسلسل الكائنات في Go (Golang): من JSON إلى Protobuf
\n\nالتسلسل هو عملية تحويل بنية البيانات (كائن، شريحة، خريطة) إلى سلسلة من البايتات للحفظ في ملف، النقل عبر الشبكة أو التخزين المؤقت. العملية العكسية هي إلغاء التسلسل. في Go (Golang) يتم حل هذه المهمة باستخدام الحزم المدمجة والمكتبات الخارجية. يعتمد اختيار الأداة على متطلبات السرعة، حجم البيانات، قابلية القراءة والتوافق مع اللغات الأخرى.
\n\n1. الحزمة المدمجة encoding/json
\n\nالطريقة الأكثر شيوعًا للتسلسل في Go. JSON هو تنسيق قابل للقراءة البشرية ومتعدد المنصات. توفر الحزمة encoding/json الدوال Marshal و Unmarshal.
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
2. encoding/xml — تسلسل XML
\n\nيستخدم XML في SOAP، RSS، وملفات التكوين. تعمل الحزمة encoding/xml بشكل مشابه لـ JSON ولكن مع وسوم xml.
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
3. encoding/gob — التنسيق الثنائي الأصلي لـ Go
\n\nتم إنشاء الحزمة encoding/gob خصيصًا لـ Go. تقوم بتشفير البيانات بكفاءة إلى تنسيق ثنائي، وتدعم الأنواع المعقدة (الواجهات، القنوات، الدوال - مع قيود).
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\n4. Protocol Buffers (protobuf) — تسلسل ثنائي سريع
\n\nطورته Google. يتطلب تعريف المخطط في ملف .proto وتوليد الكود عبر protoc. المكتبة google.golang.org/protobuf هي المعيار الحديث.
// user.proto\n// syntax = "proto3";\n// message User {\n// int32 id = 1;\n// string name =