Breaking change will cause the data to be completely wiped out

Hey guys, lately I’ve been plagued by this problem: when I change the structure of data, and upgrade my project, it shows that “you are making a BREAKING change”, and then I click “yes”, I’ll find out that my entire data is wiped out. Has anyone else met this problem? I’ll appreciate it if anyone can give me some help!
Here are some details below:
For example, here is a data structure:

#[derive(Debug, Clone, CandidType, Serialize, Deserialize)]
pub struct UserConfig {
  pub tax_method: String,
  pub base_currency: String,
  pub time_zone: String,
}
impl UserConfig {
  pub fn new(tax_method: String,base_currency:String,time_zone:String) -> UserConfig {
    UserConfig{
        tax_method,
        base_currency,
        time_zone,
    }
  }
}

If I add a element like this:

#[derive(Debug, Clone, CandidType, Serialize, Deserialize)]
pub struct UserConfig {
  pub tax_method: String,
  pub base_currency: String,
  pub time_zone: String,
  pub test_field:String
}
impl UserConfig {
  pub fn new(tax_method: String,base_currency:String,time_zone:String,test_field:String) -> UserConfig {
    UserConfig{
        tax_method,
        base_currency,
        time_zone,
        test_field
    }
  }
}

And then I deploy my canisters, my data is completly wiped out.

Here are some data structures below:
src/lib.rs

thread_local! {
  pub static STATE: RefCell<CanisterContext> = RefCell::new(CanisterContext::new());
}

CanisterContext:

#[derive(Debug, Clone, CandidType, Serialize, Deserialize)]
pub struct CanisterContext {
  pub id: u64,
  pub user_service: UserService,
  pub wallet_service: WalletService,
  pub wallet_transc_srv: WalletRecordService,
  pub neuron_service: NeuronService,
  pub trans_f_srv: TransactionService,
}

impl CanisterContext {
  pub fn new() -> Self {
    CanisterContext {
      id: 10001,
      user_service: UserService::new(),
      wallet_service: WalletService::new(),
      wallet_transc_srv: WalletRecordService::new(),
      neuron_service: NeuronService::new(),
      trans_f_srv: TransactionService::new(),
    }
  }
}

UserService:

#[derive(Debug, Clone, CandidType, Serialize, Deserialize)]
pub struct UserService {
  pub users: BTreeMap<Principal, UserProfile>,
  // ! important annotation for deserialize. if json not contains this, will
  // fill this with a empty one in rust code
  #[serde(default = "BTreeMap::new")]
  pub configs: BTreeMap<String, UserConfig>,
}

impl UserService {
  pub fn insert_user(
    &mut self,
    user: UserProfile,
  ) -> Result<UserProfile, String> {
    let owner = user.owner;
    match self.users.get(&owner) {
      Some(_) => Err(String::from(" UserAlreadyExists")),
      None => {
        self.users.insert(owner, user.clone());
        Ok(user)
      }
    }
  }

UserConfig:

#[derive(Debug, Clone, CandidType, Serialize, Deserialize)]
pub struct UserConfig {
  pub tax_method: String,
  pub base_currency: String,
  pub time_zone: String,
}
impl UserConfig {
  pub fn new(tax_method: String,base_currency:String,time_zone:String) -> UserConfig {
    UserConfig{
        tax_method,
        base_currency,
        time_zone,
    }
  }
}