2017-10-04 77 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; } 
    } 
}