2017-10-04 76 views
4

我有函數序列化對象。除了當我用特定的對象運行時,它在任何情況下都工作正常。 這是包含任務的類的對象。但我不明白爲什麼這會成爲問題。SerializeObject正在等待永久

在調試模式下,代碼只是卡在沒有任何錯誤或任何異常。只要停下來等待永遠。 另外要提到的是,這個序列化是在運行任務中調用的,但我也不確定爲什麼這會成爲問題。

我也設置屬性[NonSerialized]到所有任務屬性,但仍然沒有。

[NonSerialized] 
private Task<bool> isConnected; 
public Task<bool> IsConnected 
{ 

    get { return isConnected; } 
    set { isConnected = value; } 
} 

這是我的函數:

public static string ToJson(this object obj) 
{ 
    try 
    { 
     var res = JsonConvert.SerializeObject(obj, Formatting.Indented, 
      new JsonSerializerSettings 
      { 
       ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
      }); 

     return res; 
    } 
    catch 
    { 
     return $"Object {obj.ToString()} is not serializable."; 
    } 
} 

這是對象我試圖序列:

enter image description here

+0

這是如何被調用函數? – DiskJunky

+0

@DiskJunky我假設'string objJsonString = SomeObject.ToJson();'。 – SeM

+0

是的,它是對象上的擴展方法。 – Raskolnikov

回答

2

NonSerialized屬性所使用的BinaryFormatter的和SoapFormatter而不是由Newtonsoft Json串行器。

所以你的做法是合理的,你只需要與忽略屬性是rwad和JsonConvert理解來註釋Task性能。

您有兩種選擇。

您可以使用Newtonsoft程序集附帶的​​註釋該屬性。或者,您可以使用System.Runtime.Serialization中的DataContractDataMember屬性來註釋要序列化的類的成員。在這種情況下,您的Task<T>屬性將不是有任何屬性。

下面是一個例子,你如何使用JsonIgnore:

public class Test 
{ 
    public Test() 
    { 
     isConnected =new Task<bool>(()=> {return true;}); 
    } 

    public string Foo{get;set;} 

    private Task<bool> isConnected; 

    [JsonIgnore] // do not serialize 
    public Task<bool> IsConnected 
    {  
     get { return isConnected; } 
     set { isConnected = value; } 
    } 
} 

這裏是使用DataContract /數據成員選項時同一類:

[DataContract] // serialize this class 
public class Test2 
{ 

    public Test2(){ 
     isConnected =new Task<bool>(()=> {return true;}); 
    } 

    [DataMember] // serialize this property 
    public string Foo{get;set;} 

    private Task<bool> isConnected; 
    // no DataMember so this one isn't serialized 
    public Task<bool> IsConnected 
    { 
     get { return isConnected; } 
     set { isConnected = value; } 
    } 
}