如何在TempData中存储对象?重定向时遇序列化异常求助
解决TempData存储对象数组的序列化异常问题
这个序列化异常我太熟了!本质问题是TempData默认的存储机制(不管是Session还是Cookie)都要求存入的对象必须支持序列化,而你的obj类没做这个处理,所以重定向的时候没法把对象数组持久化传过去。给你两个靠谱的解决方案:
方案一:给实体类添加可序列化标记
如果你的项目允许修改实体类,最简单的方式是给obj类加上[Serializable]特性——这相当于告诉.NET框架:这个类的实例可以被序列化存储。注意如果obj类里包含其他自定义对象类型的属性,那些类也需要加上这个标记哦。
示例代码:
using System; [Serializable] public class obj { // 你的类属性示例 public int MovieId { get; set; } public string Title { get; set; } public DateTime ReleaseDate { get; set; } // 其他属性... }
加完标记后,你原来的代码就可以正常工作了:
// 存数据 TempData["something"] = objectarray; // 取数据 obj[] foundmoviesfromredirect = (obj[])TempData["something"];
方案二:将对象序列化为JSON字符串存储(更推荐)
如果不想修改实体类,或者担心默认二进制序列化的安全问题(.NET Core 3.0+默认禁用了BinaryFormatter),可以把对象数组序列化为JSON字符串存到TempData里,取的时候再反序列化回来。这种方式更灵活,也更安全。
用.NET内置的System.Text.Json:
using System.Text.Json; // 存储对象数组 TempData["something"] = JsonSerializer.Serialize(objectarray); // 读取并反序列化 var jsonString = TempData["something"] as string; obj[] foundmoviesfromredirect = JsonSerializer.Deserialize<obj[]>(jsonString);
用Newtonsoft.Json(很多项目的首选):
如果你项目里已经引用了Newtonsoft.Json,可以用这个:
using Newtonsoft.Json; // 存储对象数组 TempData["something"] = JsonConvert.SerializeObject(objectarray); // 读取并反序列化 var jsonString = TempData["something"] as string; obj[] foundmoviesfromredirect = JsonConvert.DeserializeObject<obj[]>(jsonString);
额外注意事项
- TempData的数据默认是一次性读取的,读取后就会被自动删除。如果需要多次使用,可以用
TempData.Peek("something")查看数据不删除,或者TempData.Keep("something")保留数据。 - 如果你的对象数组体积很大,不建议用TempData传递——毕竟TempData是基于Session或Cookie的,数据太大会影响请求性能。这种情况建议用数据库、分布式缓存(比如Redis)做中间存储。
内容的提问来源于stack exchange,提问作者Arnar Freyr
相关产品推荐
相关产品推荐

