3

我想使用MVC控制器标准Json(object)方法返回JsonResult。我的对象Model1由Fluent NHibernate构建。ASP.NET MVC JSON在功能NHibernate型号

Model1具有Model2类型的属性。在调试模式下,我看到环境创建了一个名为Castle.Proxies.Model2Proxy的代理后代类Model2。我相信Fluent Nhibernate会在内部使用它来满足我的映射。而在运行时,实际的model1.Model2的类型为Castle.Proxies.Model2Proxy

问题是,当我的Model1被序列化时,Model2也被序列化了。串行器似乎试图序列化这个对象的所有属性,包括由Castle生成并且不是我需要的那些属性。如果它没有引起异常,我会好的。也就是说,这个对象内的某个地方会出现一个循环引用,这个异常是由它引起的。这里是异常文本:

System.InvalidOperationException: A circular reference was detected while serializing an object of type 'System.Reflection.RuntimeModule'

我双重检查我的域名,并没有发现循环引用在那里,所以我责怪城堡。我对么?城堡真的应该为此负责吗?如果是这样,我有什么选择?如何让序列化程序忽略Castle属性?特别是,我怎么告诉它序列化定义类型,而不是实际的一个

我倾向于覆盖我的域模型用的ViewModels打这个问题,这是一个推荐的做法,但我真的很想知道其他治疗,如果它存在。

+0

'Model2'是否有任何机会引用其父'Model1'? –

+0

不,它绝对是导致异常的Castle代理对象:它包含层次结构下的'Type'对象,它具有'RuntimeModule'引用。当然,这个模块在这个模块中包含的所有类型的集合中都包含对这个“Type”的引用。 –

+0

如果您急于加载Model2然后将其序列化,是否会出现相同的错误? –

回答

2
一般

,它不是你的序列模型实体好的做法。
这是因为您想完全控制您序列化并发送到客户端的内容。
当您序列化您的模型实体时,您可能会序列化与它们相关联的整个对象图,而这些对象图并不一定需要/想要。
使用一些(为示例 - 如果你希望用户只查看一个Model1实体,你可能会同时送沿Model2实体,其Model3收集等一起)

标准的方式来处理它这种DTO适用于精确显示您想要显示的内容。例如:

public class Model1DTO 
{ 
    public int Id; 
    public string Name; 
    public string Model2Name; 
    //whatever other properties you need to display 
} 
+0

是啊,这就是我来(见_I往往覆盖我的域模型用的ViewModels打这个问题,这是一个推荐approach_?你可以把它叫做DTO或什么的,它仍然是一个盖)。我的问题更多的是对未来可能产生的影响感兴趣的问题,以及关于“Jsoning”等简单操作如何不可预测的说明。 –

+0

@迈克尔:对不起,我一定错过了那句话。事实上,这是推荐的方法,因为我上面描述的原因。正如你所说 - “不可预知”恰恰是正确的词。由于你的域实体可能彼此之间存在复杂的关系,其中一些可能会加载到内存中,有些可能不会,所以使用DTO或ViewModel等“扁平”对象可以更好地控制它们。 –