我收到以下错误,想知道我们是否可以使System.Data.Linq.EntitySet可序列化
无法序列化会话状态。在“StateServer”和“SQLServer”模式下,ASP.NET将序列化会话状态对象,因此不允许使用不可序列化的对象或MarshalByRef对象。如果自定义会话状态存储在“自定义”模式下完成类似的序列化,则适用相同的限制。
描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.Web.HttpException:无法序列化会话状态。在“StateServer”和“SQLServer”模式下,ASP.NET将序列化会话状态对象,因此不允许使用不可序列化的对象或MarshalByRef对象。如果自定义会话状态存储在“自定义”模式下完成类似的序列化,则适用相同的限制。
来源错误:
在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。
堆栈追踪:
[SerializationException:Type'System.Data.Linq.EntitySet`1 [[NES.HiLo.Data.DAO.UserResource,NES.HiLo.Data,Version = 1.0.5012.39381,Culture = neutral,PublicKeyToken = null]] '在Assembly'System.Data.Linq,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'未标记为可序列化。 System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type)+7738715 System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type,StreamingContext context)+258 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()+111 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj,ISurrogateSelector surrogateSelector,StreamingContext context,SerObjectInfoInit serObjectInfoInit,IFormatterConverter converter,ObjectWriter objectWriter)+422 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj,ISurrogateSelector surrogateSelector,StreamingContext context,SerObjectInfoInit serObjectInfoInit,IFormatterConverter converter,ObjectWriter objectWriter)+51 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo,NameInfo memberNameInfo,NameInfo typeNameInfo)+7636088 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph,Header [] inHeaders,__BinaryWriter serWriter,Boolean fCheck)+461 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream,Object graph,Header [] headers,Boolean fCheck)+134 System.Web.Util.AltSerialization.WriteValueToStream(Object value,BinaryWriter writer)+1577
答案 0 :(得分:7)
该异常实际上已经告诉您问题是什么,EntitySet不可序列化。因此,如果使用会话数据库功能,则无法将其存储在会话状态中。
EntitySet没有实现/支持这个。因此,要将其存储在会话状态中,您必须将数据读入您自己的对象,然后将其保存为例如。 或者只是不要尝试使用会话状态来“持久化”那些类型的对象,因为通常你不想这样做(没有最佳实践)。
答案 1 :(得分:2)
一个最简单的&最好的解决方案之一是使用Json.NET
库。
此库允许您将LINQ
个对象双向转换为其JSON
表示。
例如,您可以使用几行代码将产品存储在视图状态中:
Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Price = 3.99M;
string json = JsonConvert.SerializeObject(product);
ViewState["product"] = json ;
并将其取回:
product = JsonConvert.DeserializeObject<Product>(ViewState["product"] as string);
请参阅以下2个链接了解更多信息:
1。)http://james.newtonking.com/projects/json-net.aspx
2。)http://www.codeplex.com/json/
如果您的应用程序使用in-process
状态管理,您将能够在Session,Application和Cache中存储LINQ对象。但是,您将无法将它们存储在视图状态中。
原因是存储在视图状态中的数据是使用二进制格式化程序序列化的。
因此,另一个解决方案是使LINQ
类可序列化,您需要使用System.Data.Linq.EntitySet
属性标记所有System.Data.Linq.EntityRef
和NonSerialized
字段并标记为{ {1}}属性Serializable
类。
另一个解决方案是从LINQ
对象手动提取数据,将其存储为某种中间格式(LINQ
,class
,...等),然后手动转换回来了。