Objekt-Serialisierung in Go (Golang): von JSON bis Protobuf
\n\nSerialisierung ist der Prozess der Umwandlung einer Datenstruktur (Objekt, Slice, Map) in eine Byte-Sequenz zum Speichern in einer Datei, zur Übertragung über ein Netzwerk oder zum Caching. Der umgekehrte Prozess ist die Deserialisierung. In Go (Golang) wird diese Aufgabe mit integrierten Paketen und Drittanbieter-Bibliotheken gelöst. Die Wahl des Werkzeugs hängt von den Anforderungen an Geschwindigkeit, Datengröße, Lesbarkeit und Kompatibilität mit anderen Sprachen ab.
\n\n1. Integriertes Paket encoding/json
\n\nDie beliebteste Methode zur Serialisierung in Go. JSON ist ein menschenlesbares, plattformübergreifendes Format. Das Paket encoding/json bietet die Funktionen Marshal und 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 // Serialisierung\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 // Deserialisierung\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\nBesonderheiten:
\n- \n
- Unterstützung von Struktur-Tags zur Anpassung der Feldnamen. \n
- Funktioniert mit Slices, Maps, verschachtelten Strukturen. \n
- Langsamer als binäre Formate, aber praktisch zum Debuggen. \n
- Unterstützt keine zyklischen Referenzen. \n
2. encoding/xml — XML-Serialisierung
\n\nXML wird in SOAP, RSS, Konfigurationsdateien verwendet. Das Paket encoding/xml funktioniert ähnlich wie JSON, jedoch mit xml-Tags.
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\nWann verwenden:
\n- \n
- Integration mit Legacy-Systemen. \n
- Strenge Schemata (XSD). \n
- Dokumentorientierte Daten. \n
3. encoding/gob — natives binäres Go-Format
\n\nDas Paket encoding/gob wurde speziell für Go entwickelt. Es kodiert Daten effizient in ein binäres Format und unterstützt komplexe Typen (Interfaces, Channels, Funktionen – mit Einschränkungen).
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\nVorteile:
\n- \n
- Hohe Geschwindigkeit und Kompaktheit. \n
- Automatische Typregistrierung. \n
- Unterstützung zyklischer Strukturen. \n
Nachteil: Inkompatibilität mit anderen Sprachen.
\n\n4. Protocol Buffers (protobuf) — schnelle binäre Serialisierung
\n\nEntwickelt von Google. Erfordert die Definition eines Schemas in einer .proto-Datei und die Codegenerierung über protoc. Die Bibliothek google.golang.org/protobuf ist der moderne Standard.
// user.proto\n// syntax = "proto3";\n// message User {\n// int32 id = 1;\n// string name = Auch in der Bibliothek
Rate Limiting in Java: Bibliotheken und Tools zur Anfragenkontrolle (Bucket4j, Resilience4j)
Prometheus-Metriken in Swift: Überwachung von iOS/macOS-Apps
Datenvalidierung in TypeScript: Bibliotheken Zod, Yup und io-ts