奇妙的动态代理:EF中返回的对象为什么序列化失败
来源:互联网 发布:淘宝的二级网页打不开 编辑:程序博客网 时间:2024/06/14 01:42
今天有如鹏的学生遇到一个问题:把一个对象保存到Session中(进程外Session)后,Web服务器重启,当从Session读取这个对象的时候报错,提示是一个“T_Users”后面跟着一大串数字的类型,不是“T_Users”类型。
凭着感觉,我问“这个对象是普通对象还是什么对象”,回复说“是Entity Framework返回的对象”,瞬间我知道了:是延迟加载造成的。
下面写个程序验证一下。
数据库里建立两张表:一张T_Persons表,一张T_Dogs表,T_Dogs表中有一个MasterId字段是指向T_Persons的外键,表示“狗的主人是谁”。
然后创建数据库的Entity。然后编写下面的代码:
abcEntities e = new abcEntities();T_Persons p = e.T_Dogs.First().T_Persons;Type t = p.GetType();Console.WriteLine("对象类型:"+t);
第二行代码的意思很显然是:获得T_Dogs中第一个对象的主人对象,然后第三行获得的是对象的类型,我们惊奇的发现打印结果是:System.Data.Entity.DynamicProxies.T_Persons_A2C5F62323A22039FDCBEB40BD……
很奇怪,不应该是T_Persons类的对象吗,怎么是这么一个怪玩意。
这就涉及到“延迟加载(LazyLoading)”的原理了。对于需要延迟加载的对象,EF会动态生成一个实体类型的子类,这个子类是一个“动态代理(DynamicProxy)”类,这个类会进行延迟加载的处理。所以我们拿到的对象不直接是T_Persons类的对象,而是“动态代理(DynamicProxy)”类的子类,当然由于这个类是T_Persons的子类,所以“T_Persons p = e.T_Dogs.First().T_Persons”这样用父类的变量指向它也是可以的。多态经常偷偷帮我们做很多奇妙的事情。
由于这个对象是动态产生的类的对象,当程序重启之后,产生的“动态代理(DynamicProxy)”类和之前的“动态代理(DynamicProxy)”类就是两个类了。所以就会反序列化失败了。
很多ORM框架中延迟加载都是使用动态代理来实现的,比如Java中的Hibernate或者.Net的移植版NHibernate。
如鹏网.Net培训班正在报名,有网络的地方就可以参加如鹏网的学习,学完就能高薪就业,点击此处了解
三年前只要懂“三层架构”就可以说“精通分层架构”;现在则需要懂IOC(AutoFac等)、CodeFirst、lambda、DTO等才值钱;
三年前只要会SQLServer就可以说自己“精通数据库开发”;现在则需还需要掌握MySQL等开源数据库才能说是“.Net开源”时代的程序员;
三年前只要会进行用户上传内容的安全性处理即可;现在则需要熟悉云存储、CDN等才能在云计算时代游刃有余;
三年前只要掌握Lucene.Net就会说自己“熟悉站内搜索引擎开发”;现在大家都用ElasticSearch了,你还用Lucene.Net就太老土了;
三年前发邮件还是用SmtpClient;现在做大型网站发邮件必须用云邮件引擎;
三年前缓存就是Context.Cache;现在则是Redis、Memcached的天下;
如鹏网再次引领.Net社区技术潮流!点击此处了解如鹏网.Net最新课程
- 奇妙的动态代理:EF中返回的对象为什么序列化失败
- 关于JAVA的对象序列化----------为什么要序列化
- 奇妙的动态小程序
- 悟透JavaScript-奇妙的对象
- 悟透JavaScript - 奇妙的对象
- EF提示“序列化类型为XXX的对象时检测到循环引用”
- EF提示“序列化类型为XXX的对象时检测到循环引用”
- EF提示“序列化类型为XXX的对象时检测到循环引用”
- svn 莫名奇妙的认证失败
- 解决Android开发中,ActiveAndroid和Gson同时使用,对象序列化失败的问题
- 解决Android开发中,ActiveAndroid和Gson同时使用,对象序列化失败的问题
- java中利用动态代理,生成"空"对象的例子
- 为什么Intent或Bundle中携带的对象需要支持序列化?
- Css中奇妙的Expression
- 为什么不能返回局部对象的应用
- EF中一种简单的多条件动态查询方法
- 悟透JavaScript之奇妙的对象
- C# 中奇妙的函数–五个序列聚合运算(Sum, Average, Min, Max,Aggregate)
- Eclpise_设置Eclipse中的tab键为4个空格
- ORA-02019: 未找到远程数据库的连接说明
- (数组)leetcode 118:Pascal's Triangle
- Altium Designer应用技巧7: 封装的获取
- GBK点阵字库制作工具说明及下载
- 奇妙的动态代理:EF中返回的对象为什么序列化失败
- ViewPager 无限循环 + 周期播放
- Day-13 用js的dom操作实现图片切换
- 简析线程
- centos7 安装 nginx1.9.2
- 将linux混杂驱动改为平台驱动案例
- matlab清理程序onCleanup
- 证书与签名
- Android中绑定模式Service的使用