gpt4 book ai didi

c# - SerializeObject 永远等待

转载 作者:太空狗 更新时间:2023-10-29 23:36:24 26 4
gpt4 key购买 nike

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

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

我还为所有任务属性设置了 [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

最佳答案

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

所以你的方法是合理的,你只需要注释你的 Task具有 ignore 属性的属性是 rwad 并被 JsonConvert 理解.

你有两个选择。

您可以使用 JsonIgnore 注释该属性Newtonsoft 组件附带的。或者您可以使用 DataContractDataMember在 System.Runtime.Serialization 中找到的属性,用于注释您要序列化的类的成员。在这种情况下,您的 Task<T> properties 将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; }
}
}

关于c# - SerializeObject 永远等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46565764/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com