Protocol Buffers encoding is efficient binary serialization for Go.
1import "google.golang.org/protobuf/proto"23// Basic serialization4user := &pb.User{5 Id: 1,6 Name: "Alice",7 Email: "alice@example.com",8}910// Marshal (binary)11data, err := proto.Marshal(user)12fmt.Printf("Size: %d bytes\n", len(data)) // ~50 bytes1314// Unmarshal15var decoded pb.User16err = proto.Unmarshal(data, &decoded)1718// JSON19import "google.golang.org/protobuf/encoding/protojson"2021jsonData, err := protojson.Marshal(user)22fmt.Println(string(jsonData))23// {"id":1,"name":"Alice","email":"alice@example.com"}2425var jsonDecoded pb.User26err = protojson.Unmarshal(jsonData, &jsonDecoded)2728// Size (for verification)29size := proto.Size(user)30fmt.Printf("Protobuf size: %d bytes\n", size)3132// Clone33cloned := proto.Clone(user).(*pb.User)3435// Equal36if proto.Equal(user, &decoded) {37 fmt.Println("Equal!")38}3940// Validate (with genproto)41if err := user.Validate(); err != nil {42 log.Fatal(err)43}
Advantages over JSON: