The objects the clients and server share are part of your interface between client and server. Such an interface should be designed very carefully and shouldn't incompatibly change (at least not very often).
There is not really a smart way doing this. Every approach (if practical) has its downside. Some ideas:
- design carefully and don't change your interfaces (best practice *G*)
- use some kind of generic interface, e.g. don't store your attributes in a type safe way but use lists or maps and access them generic (getAttributeByName or something like this)
- magage the objects serial version id, let your newer objects handle "older" versions by controlling the readObject() and writeObject() methods and ignoring/defaulting unknown attributes
- block the client activity while updating the server, before the clients start over working, all (persistent) messages must have been consumed, converted and resent by some kind of "update service"
- combine all above to something even more complex and confusing
Oh, don't forget: keep it simple... *G*