Save games are a trust contract. Break it once, and your reviews, retention, and support queue get nuked.
I've seen studios ship an update, change a data structure, and corrupt thousands of saves because they didn't plan for migrations. If your players grinded for 100 hours and you wipe it... yeah. Not cool.
Look: serialization isn't "just JSON". It's CPU time, GC allocations, payload size (save files and network), and migration cost. And the first hit is often worse because reflection gets cached. Warm-up matters.

Example from this module's benchmarks (real save data, not toy structs): Unity's JsonUtility lands around ~4.5ms on the first hit, then ~1.3-1.5ms on consecutive passes, with KBs of GC alloc per operation. At 30 FPS you might shrug. At 120Hz VR that's a problem.
Quick win you can do today (and it will save your ass later):
- Add a version field to your save data.
- On load: if the version is older, run one migration method per version bump (0->1, 1->2, etc). Apply them sequentially for players returning after years.
- Before you ship the next patch: test against old saves. Not "today's saves". The ones from the last released build.
Another cheap win: if you only change a couple fields (gold++), don't deserialize the whole monster. Use partial overwrite with JsonUtility.FromJsonOverwrite when it fits.
Reality check: I've seen projects doing serialization during gameplay where it costs 300ms. That's a frame-time apocalypse. Don't do this mid-combat. If you must, pay it in a menu, a save screen, or a loading screen.

When you care about performance: protobuf-net is the bully here. In the same benchmarks, consecutive runs are around ~0.22-0.24ms, with hundreds of bytes to ~1.4KB of GC alloc. The tradeoff is real: you manage field IDs, and you never reuse them. Delete a field? Fine. Reuse its number? Enjoy broken data.
CEO/Producer translation: choose the format early and you avoid late-stage rewrites, corrupted saves, and support fires. This is boring engineering until it destroys your launch week.
This page is only the preview. Below the divider is the full step-by-step Serialization module: all four lessons, the benchmark tables across JsonUtility, Newtonsoft JSON (plus migration options), BSON, protobuf-net, MessagePack, and ScriptableObject notes, plus the full video and resources.
Join the membership and unlock the full module below.
In this module:
- 1. Budget-Friendly Serialization & Deserialization
- 2. JSON & BSON
- 3. ProtoBuf, MessagePack, ScriptableObject
- 4. Guidelines & Other Features
Join to unlock the full module, audio, and resources.