以下のようなことをやりたいのですが、どうすればいいでしょうか?

Hashtable data = new Hashtable();
data["key1"] = uint.MaxValue;
data["key2"] = ulong.MaxValue;

//確認(問題なし)
uint key1 = (uint)data["key1"];    //4294967295
ulong key2 = (ulong)data["key2"];  //18446744073709551615

//{"key2":18446744073709551615,"key1":4294967295}
string json = JsonConvert.SerializeObject(data);

//復元
Hashtable data2 = JsonConvert.DeserializeObject<Hashtable>(json);

この復元したdata2を元の型にしようとするとエラーが起きます

//System.InvalidCastException : Unable to cast object of type 'System.Int64' to type 'System.UInt32'.
uint key3 = (uint)data2["key1"];

//System.InvalidCastException : Unable to cast object of type 'System.Numerics.BigInteger' to type 'System.UInt64'.
ulong key4 = (ulong)data2["key2"];

どなたか解決方法を教えて下さい
よろしくお願いします