2014-11-16 70 views
0

我有一個GameBoard類,它有2種方法進行保存和加載:JSON.NET忽略我的所有屬性,而屬性JsonProperty

public void Save(string pFilePath) 
    { 
     var s = JsonConvert.SerializeObject(this); 
     System.IO.File.WriteAllText(pFilePath, s); 
    } 

    public static GameBoard Load(string pFilePath) 
    { 
     var s = System.IO.File.ReadAllText(pFilePath); 
     return JsonConvert.DeserializeObject<GameBoard>(s); 
    } 

這些都是我GameBoard類的屬性:

#region Fields 

    public int Width { get; protected set; } 

    public int Height { get; protected set; } 

    public GameBoardCell[,] Cells { get; protected set; } 

    public bool WallSurrounded { get; set; } 

    #endregion 

Save方法工作的很好,這是內容:

{「Width」:3,「Hei GHT 「:3,」 單元 「:[[{」 內容 「:0,」 球 「:{」 ColorID 「:0,」 ID 「:」 4481e52d-76fc-4335-805b-c47e36e3d57d 「},」 目標「:空},{ 「內容」:1, 「球」:空, 「目標」:空},{ 「內容」:0, 「球」:空, 「目標」:空}],[{ 「內容」: 0, 「球」:空, 「目標」:空},{ 「內容」:0, 「球」:空, 「目標」:空},{ 「內容」:0, 「球」:空,「目標「日期null}],[{」 內容 「:0,」 球 「:空,」 目標 「:空},{」 內容 「:1,」 球 「:空,」 目標 「:空},{」 內容「:0,」Ball「:null,」Target「:{」ColorID「:0,」ID「:」aaf6f4ae-0a1a-4c3d-9608-f13ae9c4bba7「}}]],」WallSurrounded「:true}

但是,當我使用Load方法使用相同的文件時,我所有的屬性都是null或默認值(0表示整數)。

我必須將[JsonProperty]添加到我的每個屬性才能正常工作。我之前使用過Json.NET,我記得我沒有添加任何屬性。這是從Json.NET的意圖改變(我剛從Nuget 6.0.6獲得這個新項目),還是我做錯了什麼?

+0

,你可以分享你的'BoardGame'類的相關部分,請 – user3473830

+1

您正在使用一成不變的類或不可改變的集合?你有沒有在任何地方設置過[JsonObject(MemberSerialization.OptIn)]? – dbc

+0

您寫道:「保存方法效果很好,這是內容」。但是你發佈的json中顯示的所有'Cell'屬性都有默認值。那麼,「保存」工作是否正確? – dbc

回答

3

JSON.NET忽略private,protectedinternal屬性設置器。將屬性轉換爲public,或用屬性修飾它們。

https://json.codeplex.com/discussions/222774

+0

謝謝,這就是原因。我不能將它們改爲「公共」。所以我想我必須裝飾它們。 –

+1

出於兼容性原因,我建議使用'[DataContract]'而不是'[JsonObject]'和'[DataMember]'而不是'[JsonProperty]'。 –