Marshal Comparison

Compare protobuf and JSON serialization size for the same data.

package main

import (
	"encoding/json"
	"fmt"
	"log"

	"google.golang.org/protobuf/encoding/protojson"
	"google.golang.org/protobuf/proto"

	"shortener/pb"
)

func main() {
	link := &pb.Link{
		Id:        1,
		Url:       "https://example.com",
		ShortCode: "abc123",
		Clicks:    42,
	}

	pbData, err := proto.Marshal(link)
	if err != nil {
		log.Fatal(err)
	}

	jsonData, err := json.Marshal(link)
	if err != nil {
		log.Fatal(err)
	}

	pjData, err := protojson.Marshal(link)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("protobuf:  %d bytes\n", len(pbData))
	fmt.Printf("json:      %d bytes\n", len(jsonData))
	fmt.Printf("protojson: %d bytes\n", len(pjData))
	fmt.Printf("protojson: %s\n", string(pjData))
}

💻 Run locally

Copy the code above and run it on your machine

© 2026 ByteLearn.dev. Free courses for developers. · Privacy