I'm on a crusade to learn CQRS (ala Greg Young). Currently reading CQRS The Example by Mark Nijhof and working with his example for the book. The first thing i'm starting to get confused with is domain events and replaying the events to arrive at any state of any object at any point. As Mark has stated in his book only the final state of a domain object should be recorded because of changing business logic. Buisness logic can change and you might not arrive at the same answer and also you don't want to kick out external domain events. So your essentially decoupling business logic & the actually data changes their self. So you essentially serialize the event object (which is essentially a DTO) into a datastore.
I can see this working really well if your data/object schema never changes but what do you do for object/data schema changes? So for example a really simple contrived example would be an address. Say when you first developed your app it was localized to the united states. You decide at some point to internationalize your app. You add a "Country" field and make the field required. So if your working with a static language (like Java or C#) as soon as you try to deserialize an old object for event replay then it will blow up. The only way i can see getting around this would be to either store different versions of your objects (seems to be very messy) or store your events as something more unstructured (like xml). Of course this would probably work really well with a dynamic language. I guess in c# you could probably use the DLR (dyanmic) but i think this could get messy too. Is there any other way?