2010-09-30 94 views
9

我一直在玩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); 
    } 
} 

位置已正確序列化,但在反序列化期間未恢復。有趣的是,下面的代碼按預期工作。

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); 
    } 
} 

正如你所看到的,這個矢量本身就是正確的序列化/反序列化。對於第一種情況,有沒有簡單的解決方案,還是我必須沿着自定義轉換器的方式創建一些東西?

+2

定義一個名爲類'Object'是自找麻煩。 – JaredPar 2010-09-30 22:37:28

+1

我同意,但我可以放心地說,這不是問題的根源。 – kloffy 2010-09-30 22:49:48

+0

可能的重複[爲什麼我不能反序列化這個自定義結構使用Json.Net?](http://stackoverflow.com/questions/24726273/why-can-i-not-deserialize-this-custom-struct-using- json-net) – Oxoron 2015-07-08 14:13:26

回答

9

你有兩種選擇。

  1. 變化的矢量結構的一類
  2. 或更改:

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

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

矢量結構由庫提供,所以第一個建議不是一個選項,但第二個工作。我想知道爲了讓Json.NET知道值類型並在其上默認執行任何「ObjectCreationHandling.Replace」,需要做多少工作。 (另外,'PreserveReferencesHandling.All'對於值類型也沒什麼意義,所以不需要給它們「$ id」。) – kloffy 2010-10-01 12:26:14