SerializeObject正在等待

时间:2017-10-04 13:10:03

标签: c# task

我有序列化对象的函数。它在每种情况下都能正常工作,除非我使用特定对象运行。 这是包含Tasks的类的对象。但我不明白为什么会出现问题。

在调试模式下,代码被卡住而没有任何错误或任何异常。只是停下来等待永远。 还要提一下,在运行Task时调用了这个序列化,但我也不确定为什么会出现问题。

我还将属性[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

1 个答案:

答案 0 :(得分:2)

BinaryFormatter和SoapFormatter使用NonSerialized属性,但Newtonsoft Json序列化程序不使用。{3}}属性。

因此,您的方法很合理,您只需要使用{em>忽略属性注释Task属性,该属性是JsonConvert的rwad和理解。

您有两种选择。

您可以使用Newtonsoft程序集附带的JsonIgnore注释该属性。或者,您可以使用System.Runtime.Serialization中的DataContractDataMember属性来注释要序列化的类的成员。在这种情况下,您的Task<T>属性 NOT 具有任何属性。

以下是使用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 / DataMember选项时,这是同一个类:

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