当前位置: 首页 > 面试题库 >

如何解决Json序列化循环引用错误?

邹英悟
2023-03-14
问题内容

有岗位这里,询问如何通过返回EF4CTP5序列化对象时,解决循环引用错误。不久前,我在WCF Web表单项目中遇到了同样的问题。

我能够在WCF / Web窗体项目和MVC3项目中“解决”此问题。我认为什么类型的项目都不重要,因为这似乎是EF序列化的“事物”。

我通过在ObjectContext构造函数中禁用ProxyCreation来解决此问题,如下所示:

public class MyObjectContext : DbContext, IDbContext
{
     public MyObjectContext(string connectionStringName) : base(connectionStringName)
     {
        ((IObjectContextAdapter)this).ObjectContext.ContextOptions.ProxyCreationEnabled = false;
     }
     public DbSet<Product> Products {get;set;}
     //etc.
}

我的问题是:有人可以解释为什么这看起来可以解决问题吗?

我认为问题与POCO的导航属性有关,但此后我很困惑。谢谢。


问题答案:

如果您关闭代理创建,那么您还将关闭延迟加载。实体序列化发生时,它将访问所有导航属性。如果启用了延迟加载,它将加载所有相关对象,并尝试对其进行序列化。再次访问其所有属性,包括指向父对象的导航属性。在这一点上,您必须说序列化此属性是循环引用,否则它将再次序列化对象并继续无限循环。

这里的窍门可能是用属性在子实体中注释循环导航ScriptIgnore属性。



 类似资料:
  • 问题内容: 如果我从json.net获得序列化的JSON,如下所示: 我想让淘汰赛在FooList上输出foreach,但是我不确定如何继续,因为$ ref东西可能会抛出东西。 我在想解决方案将以某种方式通过不使用以下方式强制将所有Foos呈现在FooList中: 但这似乎很浪费。 问题答案: 从服务器接收的json对象包含循环引用。在使用对象之前,您必须首先 从对象中删除所有属性,这意味着`$r

  • 问题内容: 我正在编写一个序列化程序以将POJO序列化为JSON,但陷入循环引用问题。在hibernate的双向一对多关系中,父级引用子级,而子级引用又回到父级,此时我的序列化程序死亡。(请参见下面的示例代码) 如何打破这个循环?我们可以获取对象的所有者树以查看对象本身是否存在于其所有者层次结构中的某个位置吗?还有其他方法可以找到参考是否为圆形吗?或任何其他想法来解决这个问题? 问题答案: 双向关

  • 问题内容: 是否存在现有的JavaScript库,该库将通过引用循环处理反序列化Json.Net? 这应该反序列化为一个对象,该对象在数组中的对象和外部对象之间具有引用循环 问题答案: 好的,所以我创建了一个更健壮的方法,该方法将使用$ id和$ ref,因为这实际上是json.net处理循环引用的方式。另外,您还必须在注册ID后获取引用,否则它将找不到被引用的对象,因此我还必须保留请求引用的对象

  • 问题内容: 我正在编写一个序列化程序以将POJO序列化为JSON,但陷入循环引用问题。在休眠的双向一对多关系中,父级引用子级,而子级引用又回到父级,此时我的序列化程序死亡。(请参见下面的示例代码) 如何打破这个循环?我们可以获取对象的所有者树以查看对象本身是否存在于其所有者层次结构中的某个位置吗?还有其他方法可以找到参考是否为圆形吗?或任何其他想法来解决这个问题? 问题答案: 双向关系甚至可以用J

  • 问题内容: 下面是我的控制器,它从sql db中读取数据,然后尝试将结果编码为JSON并将数据发送回我的gridview.js 这就是问题所在,使用上面的代码,我在执行gridview.js时得到了没有数据的gridview表,但是如果我直接访问控制器的方法是这样的 我得到这个错误, 序列化类型为’System.Globalization.CultureInfo’的对象时,检测到循环引用。 说明:

  • 我有一个数据结构藏书集,里面有一套书。每本书都有它所在藏书的参考文献。这是一种标准的一对多关系。它在服务器端工作得很好,但是我必须把它发送到客户端。该应用程序使用Jackson ObjectMapper进行序列化,设置为Spring Bean。问题是,您不能简单地序列化一个图书集合和书籍,因为标准JSON中没有引用(我确实需要标准JSON)。 当前的解决方案是把@JsonIgnore放在Book.