class MyObj
{
private int _Max;
public object Max
{
get
{
return (int)_Max;
}
set
{
_Max = (int)value;
}
}
}
Program.cs的
MyObj obj1 = new MyObj(100);
string json = JsonConvert.SerializeObject(obj1, Formatting.Indented);
obj1.Max = 200;
MyObj obj2 = JsonConvert.DeserializeObject<MyObj>(obj1);
运行时,在最大属性上执行Set时,它在Program.CS(反序列化)的最后一行崩溃了
Supremacy.exe中出现“System.InvalidCastException”类型的异常,但未在用户代码中处理
为什么我的设置为200,但是反序列化不起作用? 我调试了,尝试设置为obj2的200值是一个包含int的对象。
如果max上没有setter,则Program.cs正常运行
解释我为什么以及如何解决它:)
PS:我正在使用box / unboxing,因为MyObj是层次结构的一部分,它可以是任何将用作Max的原始类型。
答案 0 :(得分:1)
解决异常使用问题Convert.ToInt32
:
public object Max
{
get
{
return (int)_Max;
}
set
{
_Max = Convert.ToInt32(value);
}
}
我认为问题的发生是因为在反序列化后,编译器并不知道它是否最初是一个整数。它只有这个字符串:
{
"Max": 100
}
因此,100的值将作为字符串使用。并且.Net有一种预防机制,它不允许将一种类型(例如十进制)装箱并将其拆箱到另一种类型(例如整数)。在这里,演员从字符串发生到整数,所以也不允许这样做。 this answer中有关详细信息。