C# Net::反序列化+;从对象取消绑定
Program.csC# Net::反序列化+;从对象取消绑定,c#,json.net,C#,Json.net,Program.cs class MyObj { private int _Max; public object Max { get { return (int)_Max; } set { _Max = (int)value; } } } myobj1=新的MyObj(100); 字符串json=JsonConvert.
class MyObj
{
private int _Max;
public object Max
{
get
{
return (int)_Max;
}
set
{
_Max = (int)value;
}
}
}
myobj1=新的MyObj(100);
字符串json=JsonConvert.SerializedObject(obj1,格式化.缩进);
obj1.Max=200;
MyObj obj2=JsonConvert.DeserializeObject(obj1);
运行时,在对Max属性进行设置时,它在Program.CS(反序列化)的最后一行崩溃
Supremacy.exe中出现“System.InvalidCastException”类型的异常,但未在用户代码中处理
为什么我的设置为200,但反序列化不起作用?
我进行了调试,尝试设置为obj2的200值是一个包含int的对象
如果max上没有设置程序,则Program.cs将正常运行
向我解释为什么以及如何修复它:)
PS:我使用box/unboxing是因为MyObj是层次结构的一部分,它可以是用作Max的任何基元类型。来解决异常问题。使用
转换为32
:
MyObj obj1 = new MyObj(100);
string json = JsonConvert.SerializeObject(obj1, Formatting.Indented);
obj1.Max = 200;
MyObj obj2 = JsonConvert.DeserializeObject<MyObj>(obj1);
我认为出现这个问题是因为反序列化值后,编译器不知道它最初是否是整数。它只有以下字符串:
public object Max
{
get
{
return (int)_Max;
}
set
{
_Max = Convert.ToInt32(value);
}
}
因此,值100作为字符串使用。Net有一种防止机制,不允许装箱一种类型(例如decimal)和取消装箱到另一种类型(例如integer)。这里的强制转换是从字符串到整数的转换,因此也不允许这样做。更多详情请参阅
{
"Max": 100
}