Some of the replies here suggest using metatables. This is not the best solution for you.
In your case, remember that the only time that the XP value in the table will change is when you change it from somewhere in your codebase. This means that you can avoid all of the complicated, unreadable, and messy metatable code. Instead, you should create a function that is used for setting/updating values in CharData. That function can then trigger any code that you want to respond to XP changes, for example.
local function setXP(charData, newXP)
charData.XP = newXP
-- anything you want to happen when XP changes
end
Whenever you change XP, you call this function instead of setting charData.XP directly.