【问题标题】:Json.NET - Value-type members not getting deserialized?Json.NET - 没有反序列化的值类型成员?
【发布时间】:2010-09-30 22:29:04
【问题描述】:

我一直在玩Json.NET,我非常喜欢它。但是,在反序列化具有值类型成员的对象时遇到了问题。例如,考虑以下代码:

public struct Vector
{
    public float X;
    public float Y;
    public float Z;

    public override string ToString()
    {
        return string.Format("({0},{1},{2})", X, Y, Z);
    }
}

public class Object
{
    public Vector Position;
}

class Program
{
    static void Main(string[] args)
    {
        var obj = new Object();
        obj.Position = new Vector { X = 1, Y = 2, Z = 3 };

        var str = JsonConvert.SerializeObject(obj);

        Console.WriteLine(str); // {"Position":{"X":1.0,"Y":2.0,"Z":3.0}}

        obj = JsonConvert.DeserializeObject<Object>(str);

        Console.WriteLine(obj.Position); // (0,0,0)

        Console.ReadKey(true);
    }
}

位置序列化正确,但反序列化过程中没有恢复。有趣的是,以下代码按预期工作。

class Program
{
    static void Main(string[] args)
    {
        var vec = new Vector { X = 1, Y = 2, Z = 3 };

        var str = JsonConvert.SerializeObject(vec);

        Console.WriteLine(str); // {"X":1.0,"Y":2.0,"Z":3.0}

        vec = JsonConvert.DeserializeObject<Vector>(str);

        Console.WriteLine(vec); // (1,2,3)

        Console.ReadKey(true);
    }
}

如您所见,向量正在自行正确序列化/反序列化。第一种情况是否有简单的解决方案,还是我必须按照自定义转换器的方式创建一些东西?

【问题讨论】:

标签: c# serialization json.net value-type


【解决方案1】:

你有两个选择。

  1. 将 Vector 结构更改为类
  2. 或改变:

    obj = JsonConvert.DeserializeObject<Object>(str);
    

    obj = JsonConvert.DeserializeObject<Object>(str, new JsonSerializerSettings{ ObjectCreationHandling = ObjectCreationHandling.Replace});
    

【讨论】:

  • vector 结构由库提供,因此第一个建议不是一个选项,但第二个建议有效。我想知道需要做多少工作才能让 Json.NET 了解值类型并执行 ObjectCreationHandling.Replace 默认对它们执行的任何操作。 (另外,PreserveReferencesHandling.All 对值类型也没有多大意义,因此不需要给它们“$id”。)
猜你喜欢
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 2013-10-18
相关资源
最近更新 更多