Json.Net ::从对象反序列化+拆箱

时间:2016-02-21 01:58:09

标签: c# json.net

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的原始类型。

1 个答案:

答案 0 :(得分:1)

解决异常使用问题Convert.ToInt32

public object Max
{
    get
    {
        return (int)_Max;
    }
    set
    {
        _Max = Convert.ToInt32(value);
    }
}

我认为问题的发生是因为在反序列化后,编译器并不知道它是否最初是一个整数。它只有这个字符串:

{
  "Max": 100
}

因此,100的值将作为字符串使用。并且.Net有一种预防机制,它不允许将一种类型(例如十进制)装箱并将其拆箱到另一种类型(例如整数)。在这里,演员从字符串发生到整数,所以也不允许这样做。 this answer中有关详细信息。