我正在尝试使用MVC控制器标准的Json(object)方法返回JsonResult。我的Model1类型的对象是通过Fluent NHibernate构建的。
Model1具有类型为Model2的属性。在调试模式下,我看到环境创建了一个Model2的代理后代类,名为Castle.Proxies.Model2Proxy。我认为这是由Fluent Nhibernate内部使用的,以满足我的映射。在运行时,实际的model1.Model2是类型为Castle.Proxies.Model2Proxy。
问题在于,当我的Model1被序列化时,Model2也被序列化了。并且序列化程序似乎尝试序列化此对象的所有属性,包括由Castle生成且我不需要的属性。如果它不引起异常,我会接受它。换句话说,在该对象的某个地方存在循环引用,并且由此引发异常。以下是异常文本:
System.InvalidOperationException: 在序列化类型为'System.Reflection.RuntimeModule'的对象时检测到循环引用
我仔细检查了我的域,并没有发现循环引用,因此我责怪Castle。我是正确的吗?Castle真的应该为此负责吗?如果是,我的选择是什么?如何告诉序列化程序忽略Castle属性?特别是,如何告诉它序列化定义的类型而不是实际的类型?
我倾向于使用ViewModels覆盖我的域模型以解决此问题,这是一种推荐的方法,但我真的很想知道是否存在其他解决方法。
Model1具有类型为Model2的属性。在调试模式下,我看到环境创建了一个Model2的代理后代类,名为Castle.Proxies.Model2Proxy。我认为这是由Fluent Nhibernate内部使用的,以满足我的映射。在运行时,实际的model1.Model2是类型为Castle.Proxies.Model2Proxy。
问题在于,当我的Model1被序列化时,Model2也被序列化了。并且序列化程序似乎尝试序列化此对象的所有属性,包括由Castle生成且我不需要的属性。如果它不引起异常,我会接受它。换句话说,在该对象的某个地方存在循环引用,并且由此引发异常。以下是异常文本:
System.InvalidOperationException: 在序列化类型为'System.Reflection.RuntimeModule'的对象时检测到循环引用
我仔细检查了我的域,并没有发现循环引用,因此我责怪Castle。我是正确的吗?Castle真的应该为此负责吗?如果是,我的选择是什么?如何告诉序列化程序忽略Castle属性?特别是,如何告诉它序列化定义的类型而不是实际的类型?
我倾向于使用ViewModels覆盖我的域模型以解决此问题,这是一种推荐的方法,但我真的很想知道是否存在其他解决方法。
Model2
是否有任何参考其父级Model1
的引用? - Andrew WhitakerType
对象,该对象具有RuntimeModule
引用。而且这个模块自然地包含了对此Type
的引用,在该模块中包含了所有类型的集合中。 - Michael Sagalovich