问题描述
在使用JsonConvert.SerializeObject时出错 try catch 捕捉到Self referencing loop detected for property错误。
问题状态
已解决。
解决方法
这是你的某个属性内部形成了巡坏 导致序列化失败。
失败案例:
public class A
{
private List<A> children = new List<A>();
public List<A> Children { get => children; set => children = value; }
public A parent { get; set; }
}
public class B
{
public void test()
{
List<A> data = new List<A>();
A a1 = new A();
A a2 = new A { parent = a1 };
a1.Children.Add(a2);
data.Add(a1);
string s = JsonConvert.SerializeObject(data);
}
}
现在如果你试图使用 JsonConvert.SerializeObject(data) 来序列化data的话就会提示刚才的那个错误,因为你a1的children里面包含有a2 a2的parent里面又回到的a1,这就形成了一个循环,就会出现上面的错误。
因为我所使用的情况是在反序列化的时候并不需要data的数据 所以我的操作是私有化让他不参与序列化操作:
public class A
{
private List<A> children = new List<A>();
public List<A> Children { get => children; set => children = value; }
public A parent { get; set; }
}
public class C
{
private List<A> a = new List<A>();
public C(List<A> _a )
{
a = _a;
}
}
public class B
{
public void test()
{
try
{
List<A> data = new List<A>();
A a1 = new A();
A a2 = new A { parent = a1 };
a1.Children.Add(a2);
data.Add(a1);
C c = new C(data);
string s = JsonConvert.SerializeObject(c);
C c1 = JsonConvert.DeserializeObject<C>(s);
}
catch (Exception e)
{
string ee = e.Message;
return;
}
}
}
这样就解决了 ,但是反序列化的时候c1的a 是没有数据的,但C的其他属性是会正确的进行序列化和反序列化操作,这样就解决了我所遇见的问题,既在C里面操作了data数据,又让C的其他属性能够进行序列化和反序列化操作。
至于如何才能将data正确的进行序列化和反序列化操作我就不知道了,有知道的大神可以告诉我。
水平有限,仅供参考,发现错误请和我沟通。