Older savegames (which happens while new features are introduced and not saved yet) require as well the restoration of the defaults, since the needed value was not supplied.
Useless messages are pruned from the history which cause a difference but is harmless. Server savegames only sent the number and age of trees, not the position to save memory (which can be a lot). This does not affect the gamestate but causes differences.
There may be also some fine internal counter are reset to zero during savegames. One could make of course an automatic check, loading a game, saving it, and then saving it immeadiately again while asserting of deviation from the previous save.
Or you do this manually using <xml> which gives you GB size text files which you throw at diff ...
EDIT: I did so. The main deviation between savegames are a different order of pedestrains, which is not critical (unless more than 254 amass on one tile, which mey lead to desync). If there are animated pedestrians, the animation is also not saved (same for some clouds). Also the finish_rd for the map is called multithreading, so it can change the savegame but not affect the game state. Finally the synv_step is called with (0) after loading even when paused, so soem object may cease to exist during the time for loading.
I do not think it is worth investing time here, especially a zipped game reload is much faster than the server sending out its savegame and the client has to recieve it and reload it anyway.