3

我正在尝试JsonResult使用 MVC 控制器标准Json(object)方法返回。我的类型对象Model1是由 Fluent NHibernate 构建的。

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

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

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

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

我倾向于用 ViewModels 覆盖我的域模型来解决这个问题,这是一种推荐的方法,但我真的很想知道另一种治疗方法,如果它存在的话。

4

1 回答 1

2

一般来说,序列化模型实体不是一个好习惯。
这是因为您希望完全控制您序列化并发送给客户端的内容。
当您序列化模型实体时,您可能正在序列化与它们关联的整个对象图,您不一定需要/想要。
(例如 - 如果您希望用户只查看一个Model1实体,您可能还会发送一个Model2实体及其Model3集合等)

处理它的标准方法是使用某种 DTO,它们适用于精确显示您想要显示的内容。例如:

public class Model1DTO
{
   public int Id;
   public string Name;
   public string Model2Name;
   //whatever other properties you need to display
}
于 2011-07-13T05:23:17.960 回答