我有序列化对象的功能。在任何情况下,它都能正常工作,除非我运行特定对象。这是包含“任务”的类的对象。但是我不明白为什么会这样。
在调试模式下,代码只是卡住而没有任何错误或任何异常。停下来等着。还要提到在运行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)
这是我尝试序列化的对象:
该NonSerialized属性由 BinaryFormatter 和 SoapFormatter 使用,但不由 Newtonsoft Json 序列化程序使用。
所以你的方法是合理的,你只需要使用 rwad 并被 理解的忽略Task属性来注释你的属性。JsonConvert
你有两个选择。
JsonIgnore您可以使用 Newtonsoft 程序集附带的属性来注释该属性。或者,您可以使用System.Runtime.Serialization 中的DataContract和DataMember属性来注释要序列化的类的成员。在这种情况下,您的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)
| 归档时间: |
|
| 查看次数: |
330 次 |
| 最近记录: |