Json.NET - 没有反序列化的值类型成员?

klo*_*ffy 9 c# serialization value-type json.net

我一直在玩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);
    }
}
Run Code Online (Sandbox Code Playgroud)

位置已正确序列化,但在反序列化期间不会恢复.有趣的是,以下代码按预期工作.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,向量正在自行进行正确的序列化/反序列化.对于第一种情况,是否有一个简单的解决方案,或者我是否必须创建自定义转换器的内容?

Mat*_*ela 9

你有两个选择.

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

    obj = JsonConvert.DeserializeObject<Object>(str);
    
    Run Code Online (Sandbox Code Playgroud)

    obj = JsonConvert.DeserializeObject<Object>(str, new JsonSerializerSettings{ ObjectCreationHandling = ObjectCreationHandling.Replace});
    
    Run Code Online (Sandbox Code Playgroud)