我正在尝试序列化域模型并遇到一个需要将动态代理转换为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); } }
解决方法
这是一个已知的问题
We fixed an issue in ScriptIgnoreAttribute,which was not being propagated to derived classes. Since POCO proxy types are created by deriving from the POCO class provided by the user,the JavaScriptSerializer wasn’t able to see the [ScriptIgnore] attributes you have in your repro.
The fix won’t be included in the next preview release of .NET 4.5.
(所以大概你必须等待下面的预览版或最终版)
这是在.NET 4.5中修复的
根据该问题的评论,如果您使用的是当前版本的JSON.Net,您似乎可以通过使用NonSerializedAttribute而不是ScriptIgnoreAttribute来解决问题.