延迟加载与序列化

简介:

如果使用了延迟加载(Lazy Load),那么,我们就会在序列化的时候碰到 延迟加载 变成了 “立即加载” 的问题。这是为什么呢,因为序列化器会去访问对象的属性,这就会导致属性的 get 方法内的代码被执行起来。

比如,类型:

    class Test
    {
        public string Name {get; private set;}
        public PaperStrategy Paper
        {
            get
            {
                if (paper == null)
                {
                    paper = PaperStrategy.GetPaperByTest(this);
                }

                return paper;
            }
        }
    }

当返回给前台的时候,我们只需要返回 Name 属性就可以,但是,如果我们使用 JavaScriptSerializer (即 ASP.NET MVC 默认的 JSON 序列化器)的时候,序列化器会默认去遍历全部的属性,这就会导致业务上并不需要加载的 Paper 被序列化器自动加载了。

这是不能容忍的。解决方案有:

一:为属性加入 [ScriptIgnore]

即:

[ScriptIgnore]
public PaperStrategy Paper

Attribute ScriptIgnore 会通知 JavaScriptSerializer 不去序列化此属性,这样,就不会执行 get 中的代码;

不过,这带来一个问题,如果在别的请求中,又是需要这个属性的 Value ,该怎么办。所以,通过加 Attribute 来指导序列化并不可取。

 

二:构筑匿名类型

或者,我们在控制器中构筑匿名类型,如下,这就相当于存在一个转换过程,如果属性较多的话,就相对的编码烦多。

public class HomeController : SessionController
{
    public ActionResult Test(int id)
    {
        var test = Session.Get<Test>(id);

        return Json(new
        {
            test.Name
        }, JsonRequestBehavior.AllowGet);
    }
}

 

三:使用 ViewModel

如果我们觉得以上两种不合意,则可以强迫自己使用 ViewModel,即创建一个 TestDto,只包含需要序列化的字段,当然,这仍然需要一个类似 二 中的转换。不过,过多的实体类,不是我喜欢的,所以并不建议此种做法(如想减少实体类,请参看:减少到处衍生的实体类)。所以,大部分情况下,推荐的做法还是 构筑匿名类型 来达到 延迟加载 和 序列化 之间的平衡,除非我们有十分强烈的使用 ViewModel 的理由,比如:使用绑定。

 

本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/p/3804064.html,如需转载请自行联系原作者

相关文章
阿里云备案流程、操作步骤及所需时间图文详解
阿里云网站一共经过五步骤,先提交材料到阿里云初审,阿里云初审通过后提交到管局,用户进行工信部短信核验,最后等待管局审核即可。整个过程快的话2天即可搞定,慢的话需要20多天左右
2763 0
阿里云备案流程、操作步骤及所需时间图文详解
虚拟机可以ping通本机,本机ping不通虚拟机(一步搞定,亲测有效)
虚拟机可以ping通本机,本机ping不通虚拟机(一步搞定,亲测有效)
虚拟机可以ping通本机,本机ping不通虚拟机(一步搞定,亲测有效)
|
SQL 存储 监控
【Spring + Vue前后端分离】可商用的开源后台管理框架软件eladmin剖析
【Spring + Vue前后端分离】可商用的开源后台管理框架软件eladmin剖析
913 0
【Spring + Vue前后端分离】可商用的开源后台管理框架软件eladmin剖析
|
存储 算法 openCL
HLS开发学习-01-HLS介绍与FPGA简单内部介绍
HLS开发学习-01-HLS介绍与FPGA简单内部介绍
614 0
HLS开发学习-01-HLS介绍与FPGA简单内部介绍
|
存储 机器学习/深度学习 算法
K近邻算法哪家强?KDTree、Annoy、HNSW原理和使用方法介绍
K近邻算法哪家强?KDTree、Annoy、HNSW原理和使用方法介绍
|
Prometheus 监控 Cloud Native
如何开启Apache SkyWalking的自监控?
1. 开启Prometheus遥测数据 默认情况下, 遥测功能(telemetry)是关闭的(selector 为 none),像这样:
590 0
如何开启Apache SkyWalking的自监控?
|
弹性计算 Kubernetes 安全
7招!实现安全高效的流水线管理
云效团队多年来为阿里巴巴内部(Aone)和云上企业用户(云效)分别提供研发运维工具,并致力于打造企业级一站式的 DevOps 平台,更多关注不同类型的企业用户在使用过程中的管理与协作场景,本文将重点介绍高效安全管理云效流水线的7招:
2840 0
7招!实现安全高效的流水线管理
|
Web App开发 安全 大数据
阿里云acp认证报名方法 阿里云acp认证考试相关答疑
云服务已经成为当前互联网技术的重点发展方向,在我国以阿里云为代表的云服务产业每年都在快速增长。这不仅提供了大量的就业岗位,也为从业人员打造了良好的职业发展道路。阿里云相对于其他厂商有更良好的生态圈,其上下游产业对于专业人员的需求量更大,因此持有阿里云认证的从业人员在就业上更具优势。今天就介绍阿里云acp认证报名方法,并回答一些考生关注的问题。
480 0
阿里云acp认证报名方法 阿里云acp认证考试相关答疑
|
机器学习/深度学习 供应链 小程序
解决方案应用实例 |良品铺子借力数据中台,全面推进数字化战略
阿里云数据中台零售行业解决方案帮助良品铺子打通各系统数据,并且统一出标准口径,更好地向前端业务和消费者进行赋能。未来,数据中台还将改变良品铺子的组织发展重心和方向。
1218 0
解决方案应用实例 |良品铺子借力数据中台,全面推进数字化战略