I would recommend to stick to the second approach (save and load the state_dict), as the former approach can break in various ways.
That being said, could you post the error message for the shape mismatch and check, what might have changed in the model?
E.g. did you store the state_dict and changed the embedding layer afterwards somehow?