So, question for the gurus:
Is there a better pattern for solving the problems I've outlined
above, particularly one that doesn't require a similar hack for every
subclass?
Did you check whether NSUnarchiver and NSArchiver have any useful
methods? The NSArchiverCallback informal protocol for NSObject sounds
like it could solve your problem or alleviate it a bit. It seems to
allow providing a different object to archive in place of the current
object.
NSUnarchiver also has -replaceObject:withObject:, which looks like
it's the opposite.
I hope that hasn't been mentioned yet, I haven't yet managed to go
up-thread on this one.