【发布时间】:2012-07-06 04:18:47
【问题描述】:
我在尝试序列化域模型时遇到了需要将动态代理转换为 POCO 的问题。我遇到的问题是模型中的虚拟属性存在循环引用。尽管我尝试使用[ScriptIgnore] 来让序列化程序不解析这些属性,但它仍然可以。我相信这是因为对象是动态代理,并且属性中仍然存在一些残余物导致解析器进入(这反过来导致递归错误“循环引用” - 我尝试将递归限制为 3 个步骤,但我得到了“超出递归步骤”的错误)。
如何将对象从动态代理转换为 POCO,以便对其进行序列化?
编辑:简单示例
public class One : BaseViewModel
{
public int OneId { get; set; }
public virtual ICollection<Two> Two { get; set; }
}
public class Two
{
public int TwoId { get; set; }
public int OneId { get; set; }
[ScriptIgnore]
public virtual One One { get; set; }
}
public abstract class BaseViewModel
{
public string AsJson()
{
var serializer = new JavaScriptSerializer();
return serializer.Serialize(this);
}
}
【问题讨论】:
-
代理是它们所代表的 POCO 的子类。通常,您应该能够很好地序列化它们。你能发布一个你无法序列化的类的小而完整的例子吗?
-
@EricJ。 - 正常构造时,类序列化。我可以发布一个示例,但我不确定它会有多大帮助,因为运行时它会运行得很好。主要问题是当使用来自 ObjectContext 的数据实例化类时。这是当虚拟属性内部仍然存在引用时,即使它们应该为空,因为它们并未全部包含在对数据库的查询中。
-
查看给您带来问题的类的结构可能会有所启发。
-
@EricJ。 - 这是循环引用。
-
接受的答案解决了序列化问题,但here 是您原始问题的答案。
标签: c# asp.net-mvc-3 serialization entity-framework-4.1 dynamic-proxy