Json.Net::Deserialize + Unboxing from object


class MyObj
{
    private int _Max;
    public object Max
    {
        get
        {
            return (int)_Max;
        }
        set
        {
            _Max = (int)value;
        }
    }
}

程序.cs

MyObj obj1 = new MyObj(100);
string json = JsonConvert.SerializeObject(obj1, Formatting.Indented);
obj1.Max = 200;
MyObj obj2 = JsonConvert.DeserializeObject<MyObj>(obj1);

运行时,它在 Program.CS(反序列化)的最后一行崩溃,同时在 Max 属性上执行 Set

Supremacy 中发生了类型为"System.InvalidCastException"的异常.exe但未在用户代码中处理

为什么我的设置为 200 有效,而反序列化不起作用?我调试了,尝试设置为 obj2 的 200 值是一个包含 int 的对象。

如果最大值没有二传器,程序.cs正常运行

解释我为什么以及如何修复它:)

PS:我正在使用盒子/拆箱,因为MyObj是层次结构的一部分,它可以是任何将用作Max的基元类型。

要解决异常使用Convert.ToInt32的问题:

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

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

{
  "Max": 100
}

因此,值 100 作为字符串使用。.Net有一个预防机制,不允许将一种类型(例如十进制)装箱,而将装箱为另一种类型(例如整数)。在这里,强制转换从字符串到整数发生,因此也不允许。有关此答案的更多详细信息。

标记一行...

return (int)_Max;

第 5 行应为

return (object)_Max;

因为在第 1 行,Max 是对象。

相关内容

  • 没有找到相关文章

最新更新