تسلسل الكائنات في Go (Golang): من JSON إلى Protobuf
التسلسل (الترميز) هو عملية تحويل بنية البيانات (كائن) إلى سلسلة من البايتات لنقلها عبر الشبكة أو حفظها على القرص. العملية العكسية هي إلغاء التسلسل (فك الترميز). في Go، يتم حل هذه المهمة باستخدام حزم قياسية وحزم خارجية. دعنا نستعرض الطرق الرئيسية.
1. المكتبة القياسية: encoding/json
الطريقة الأكثر شيوعًا. للتسلسل، يتم استخدام الحزمة encoding/json.
مثال أساسي
package main
import ( "encoding/json" "fmt" "log")
type User struct { ID int `json:"id"` Name string `json:"name"` Email string `json:"email,omitempty"`}
func main() { user := User{ID: 1, Name: "Alice", Email: "alice@example.com"}
// التسلسل (Marshal) jsonData, err := json.Marshal(user) if err != nil { log.Fatal(err) } fmt.Println(string(jsonData)) // {"id":1,"name":"Alice","email":"alice@example.com"}
// إلغاء التسلسل (Unmarshal) var decoded User err = json.Unmarshal(jsonData, &decoded) if err != nil { log.Fatal(err) } fmt.Printf("%+v", decoded) // {ID:1 Name:Alice Email:alice@example.com}}وسوم الهياكل الهامة
json:"field_name"— يحدد اسم الحقل في JSON,omitempty— يتجاوز الحقل إذا كان فارغًا (مثل سلسلة فارغة، 0، nil),string— يفرض تمثيلًا نصيًا للحقول الرقمية-— يتجاهل الحقل أثناء التسلسل
2. التسلسل إلى XML: encoding/xml
تعمل الحزمة encoding/xml بنفس المبدأ، ولكنها تستخدم وسوم XML.
package main
import ( "encoding/xml" "fmt")
type Person struct { XMLName xml.Name `xml:"person"` Name string `xml:"name"` Age int `xml:"age,attr"`}
func main() { p := Person{Name: "Bob", Age: 30} xmlData, _ := xml.MarshalIndent(p, "", " ") fmt.Println(string(xmlData)) // الإخراج: // <person age="30"> // <name>Bob</name> // </person>}يتم دعم السمات (,attr) والعناصر المتداخلة و CDATA ومساحات الأسماء.
3. التسلسل الثنائي: encoding/gob
الحزمة gob هي تنسيق Go الخاص للتسلسل الثنائي. مثالية لتبادل البيانات بين تطبيقات Go.
package main
import ( "bytes" "encoding/gob" "fmt" "log")
type Data struct { X, Y int Label string}
func main() { var buf bytes.Buffer enc := gob.NewEncoder(&buf) data := Data{X: 10, Y: 20, Label: "test"}
// الترميز if err := enc.Encode(data); err != nil { log.Fatal(err) }
// فك الترميز var decoded Data dec := gob.NewDecoder(&buf) if err := dec.Decode(&decoded); err != nil { log.Fatal(err) } fmt.Printf("%+v", decoded) // {X:10 Y:20 Label:test}}خصائص gob:
- يتطلب تسجيل الأنواع مسبقًا (إذا تم استخدام الواجهات)
- أكثر إحكاما من JSON للبيانات الثنائية
- غير مدعوم بلغات أخرى (فقط Go)
4. Protocol Buffers (protobuf)
بروتوكول Google للتسلسل الثنائي الفعال. يتطلب تثبيت protoc والإضافة protoc-gen-go.
الخطوة 1: تعريف المخطط (user.proto)
syntax = "proto3";package main;
message User { int32 id = 1; string name = 2; string email = 3;}الخطوة 2: توليد الكود
protoc --go_out=. user.proto
أيضاً في المكتبة
توصيات