The ObjectID has to be the same after deserialization for obvious reasons when deserialization is used in a remoting scenario, and because the serialization code doesn't know in which context it is used, the same ObjectID will be used.
I didn't make CreateEntityFactory public as I couldn't think of a purpose which would require to have a public method. As making it public will break existing code which overrides the protected method, I can't change this as well.
You could add an interface to the entities (in the designer), and through an include template generate the implementation of the interface to the entity classes, which simply exposes the factory through a public method or property and calls the CreateEntityFactory method.
You could also generate partial classes for this.