i use arrays of structs as memory pools, and use the array indexes for the IDs. to load or save, all i have to do is read or write the array - no pointer fixups required at all - just load'n'go.
i use memory pools and IDs for:
static mesh assets, skinned mesh assets, texture assets, material assets, WAV assets, player entity instances, non-player entity instances, NPC instances, action types, object types, skill types, quest types, quest instances, and probably a few other things that don't come to mind at the moment. they all use IDs. quest types are the only thing that doesn't use a memory pool as well - quest types are pretty much 100% code (init, run, get map marker locations, get treasure location, select quest, view quest - that kind of stuff).