SerializeObject一直在等待

Ras*_*kov 5 c# task

我有序列化对象的功能。在任何情况下,它都能正常工作,除非我运行特定对象。这是包含“任务”的类的对象。但是我不明白为什么会这样。

在调试模式下,代码只是卡住而没有任何错误或任何异常。停下来等着。还要提到在运行Task时调用了此序列化,但是我也不知道为什么会出现问题。

我还已将[NonSerialized]属性设置为所有Task属性,但仍然没有设置。

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

    get { return isConnected; }
    set { isConnected = value; }
} 
Run Code Online (Sandbox Code Playgroud)

这是我的功能:

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.";
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我尝试序列化的对象:

在此处输入图片说明

ren*_*ene 2

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

所以你的方法是合理的,你只需要使用 rwad 并被 理解的忽略Task属性来注释你的属性。JsonConvert

你有两个选择。

JsonIgnore您可以使用 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; }
    } 
}
Run Code Online (Sandbox Code Playgroud)

这是使用 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; }
    } 
}
Run Code Online (Sandbox Code Playgroud)