I have limited experience with boost::serialization but I would probably start by reducing the amount of work you do in the serialization function to home in on exactly which type is causing the issues. Once you know what exact type is causing the problems it should be much easier to figure out what goes wrong.
Thanks for the advice - I did this and apparently it was one of the booleans that was causing the problem (the exception code had me looking in all the wrong places!).
My tile factory function creates a Tile object and then sets all its variables depending on what type of tile it is; due to an oversight I was apparently setting a bool to an uninitialised value, and though it wasn't causing any ingame problems, Boost didn't like trying to serialize it. I'm still a bit confused about why it was throwing that particular exception code but all's well that ends well.