2010-01-23 58 views
10
[Serializable] 
public class ModelResource:ISerializable 
{ 
    public Int64 Ore { get; private set; } 
    public Int64 Crystal { get; private set; } 
    public Int64 Hydrogen { get; private set; } 
    //needs to be ignored 
    public Int64 Total { get { return Ore + Hydrogen + Crystal; } } 
    public string ResourceType { get; private set; } 
    public Int64 HerculesNeeded { get { return Total/25000; } } 
    public Int64 AtlasNeeded { get { return Total/5000; } } 

    public bool IsPlanet { get { return ResourceType == "Planet"; } } 
    //causes serializer to stackoverflow 
    public ModelResource MakeChild {get{return new ModelResource(Ore/2,Crystal/2,Hydrogen/2);}} 


    public string ToJson() 
    { 
     var jss = new System.Web.Script.Serialization.JavaScriptSerializer(new SimpleTypeResolver()); 
     return jss.Serialize(this); //throws recursion limit exceed exception 
    } 
    #region ISerializable Members 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("Ore", Ore); 
     info.AddValue("Crystal", Crystal); 
     info.AddValue("Hydrogen", Hydrogen); 
     info.AddValue("ResourceType", ResourceType); 
    } 
    private ModelResource(SerializationInfo si, StreamingContext context) 
    { 
     Ore = si.GetInt64("Ore"); 
     Crystal = si.GetInt64("Crystal"); 
     Hydrogen = si.GetInt64("Hydrogen"); 
     ResourceType = si.GetString("ResourceType"); 
    } 


    #endregion 
} 
+0

你可以在你打給ToJson的地方顯示一個代碼示例嗎?它不會拋出當我嘗試出來... – 2010-01-23 21:47:44

+0

我懷疑至少*一些*代碼已被省略,因爲沒有好的方法來設置值 - ? – 2010-01-23 21:54:31

回答

14

通常我會建議告訴它忽略父屬性(創建週期) - 在這種情況下,通過添加[ScriptIgnore] - 但我除了基本成員之外什麼都看不到 - 這個類本身足以導致錯誤?

+0

我以爲是這樣,讓我檢查... – Maslow 2010-01-23 21:51:26

+0

顯然我離開了這一個屬性,我想也許JavaScriptSerializer會注意ISerializable接口 – Maslow 2010-01-23 23:43:55