我有序列化对象的函数。它在每种情况下都能正常工作,除非我使用特定对象运行。 这是包含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.";
}
}
这是我尝试序列化的对象:
答案 0 :(得分:2)
BinaryFormatter和SoapFormatter使用NonSerialized
属性,但Newtonsoft Json序列化程序不使用。{3}}属性。
因此,您的方法很合理,您只需要使用{em>忽略属性注释Task
属性,该属性是JsonConvert
的rwad和理解。
您有两种选择。
您可以使用Newtonsoft程序集附带的JsonIgnore
注释该属性。或者,您可以使用System.Runtime.Serialization中的DataContract
和DataMember
属性来注释要序列化的类的成员。在这种情况下,您的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; }
}
}