延迟加载与序列化

简介:

如果使用了延迟加载(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,如需转载请自行联系原作者

相关文章
|
机器学习/深度学习 人工智能 算法
人工智能在医疗诊断中的应用与挑战
本文探讨了人工智能(AI)在医疗诊断领域的应用及其面临的挑战。随着技术的不断进步,AI已经在医学影像分析、疾病预测和个性化治疗等方面展现出巨大潜力。然而,数据隐私、算法透明度以及临床整合等问题仍然是亟待解决的关键问题。本文旨在通过分析当前AI技术在医疗诊断中的具体应用案例,探讨其带来的优势和潜在风险,并提出相应的解决策略,以期为未来AI在医疗领域的深入应用提供参考。
399 3
|
机器学习/深度学习 测试技术
强化学习让大模型自动纠错,数学、编程性能暴涨,DeepMind新作
【10月更文挑战第18天】Google DeepMind提出了一种基于强化学习的自动纠错方法SCoRe,通过自我修正提高大型语言模型(LLMs)的纠错能力。SCoRe在数学和编程任务中表现出色,分别在MATH和HumanEval基准测试中提升了15.6%和9.1%的自动纠错性能。
351 4
|
容器
基于Arduino的植物浇水系统
基于Arduino的植物浇水系统
241 0
|
人工智能 算法 安全
评测报告:《10 分钟构建 AI 客服并应用到网站、钉钉或微信中》
该方案简化了在网站及社交平台添加AI助手的过程,通过直观的设计使用户能迅速上手。阿里云控制台让创建及配置AI变得轻而易举,实现十分钟内快速部署。详细的引导步骤与文档显著降低了学习门槛,即使初次接触也能顺利解决问题。方案提供了高度定制化的选项以满足企业多样化需求,并确保在生产环境中稳定运行。此外,阿里云AI客服解决方案具备丰富的功能,如语音交互、图片识别等,配合快速准确的响应,极大提升了用户体验。总体而言,该方案凭借其易用性和强大功能赢得了好评。
|
存储 安全 算法
什么是秒合约?竞猜游戏交易所app系统开发规则介绍
秒合约是一种基于区块链技术的超短期衍生品合约,交易周期以秒为单位。它通过智能合约实现交易的自动化和去信任化,优化执行流程,提高交易速度和效率。秒合约适合高风险投机者,收益和风险固定,不使用杠杆。此外,竞猜游戏交易所app系统也涉及快速交易和投机,需确保安全、稳定及合规运营。
|
机器学习/深度学习 数据采集 人工智能
机器学习入门:Python与scikit-learn实战
机器学习入门:Python与scikit-learn实战
486 0
|
传感器 人工智能 数据挖掘
柔性电子器件:未来可穿戴技术的趋势
【9月更文挑战第30天】柔性电子器件是一种将电子元件集成在柔性基板上的新兴技术,具备出色的灵活性和适应性。本文探讨了其定义、发展历程及关键技术,并展望了其在可穿戴设备中的应用前景。柔性电子器件不仅能够实时监测生理信号,还能实现自然图像显示和持久能量供应,推动医疗健康、智能手表等领域的发展。尽管面临制造成本和耐久性等挑战,其市场潜力巨大,预计到2025年将达到340亿美元,引领智能穿戴技术的新时代。
|
网络协议 算法 网络安全
OSPF协议概述
OSPF协议概述
717 0
|
数据采集 安全 API
如何获得淘宝/天猫淘宝商品详情 API接口
要获取淘宝商品详情 API 接口,主要途径包括:1) 淘宝开放平台注册账号、创建应用并获取 API 密钥;2) 使用淘宝提供的商品详情接口(如 taobao.item.get);3) 通过第三方数据服务平台获取封装后的 API 接口;4) 自行开发爬虫程序(不推荐)。
|
机器学习/深度学习 人工智能 自然语言处理
【人工智能】深度解读 ChatGPT基本原理
ChatGPT是OpenAI开发的一种基于人工智能技术的自然语言处理工具,它代表了自然语言处理(NLP)技术的前沿进展。ChatGPT的基本原理建立在一系列先进技术和方法之上,主要包括GPT(Generative Pre-trained Transformer)模型架构、预训练与微调技术、以及可能采用的RLHF(Reinforcement Learning from Human Feedback)等高级训练策略。下面将详细解读ChatGPT的基本原理和关键技术:
735 1