我得到了以下错误,并想知道我们是否可以使System.Data.Linq.EntitySet可序列化
无法序列化会话状态。在“StateServer”和“SQLServer”模式下,ASP.NET将序列化会话状态对象,因此不允许非序列化对象或MarshalByRef对象。如果自定义会话状态存储在“自定义”模式下执行类似的序列化,则同样的限制也适用。 描述:在执行当前web请求时发生了未处理的异常。请查看堆栈跟踪以获得有关错误的更多信息,以及它起源于代码的位置。 异常详细信息: System.Web.HttpException:无法序列化会话状态。在“StateServer”和“SQLServer”模式下,ASP.NET将序列化会话状态对象,因此不允许非序列化对象或MarshalByRef对象。如果自定义会话状态存储在“自定义”模式下执行类似的序列化,则同样的限制也适用。 源错误: 在执行当前web请求期间生成一个未处理的异常。有关异常的起源和位置的信息可以使用下面的异常堆栈跟踪来标识。 堆栈跟踪: [SerializationException: Type SerializationException NES.HiLo.Data,Version=1.0.5012.39381,Culture=neutral,PublicKeyToken=null]‘在程序集'System.Data.Linq,Version=3.5.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089’中,没有标记为可序列化的。]( System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType类型) +7738715 System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type类型,StreamingContext上下文) +258 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() +111个System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj,ISurrogateSelector surrogateSelector,StreamingContext上下文,SerObjectInfoInit serObjectInfoInit,IFormatterConverter转换器,ObjectWriter objectWriter) +422 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj,ISurrogateSelector surrogateSelector,StreamingContext context,StreamingContext ISurrogateSelector,转换器,+51 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo,NameInfo memberNameInfo,NameInfo typeNameInfo) +7636088 System.Web.Util.AltSerialization.WriteValueToStream(Object图,Header[] inHeaders,__BinaryWriter serWriter,Boolean ) +461 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream,对象图,fCheck标头,布尔值System.Web.Util.AltSerialization.WriteValueToStream(Object) +134 System.Web.Util.AltSerialization.WriteValueToStream(Object值,写入器) +1577
发布于 2013-09-21 22:32:42
这个异常实际上告诉您问题是什么,EntitySet是不可序列化的。因此,如果使用会话DB功能,则不能将其存储在会话状态中。
EntitySet不实现/支持这一点。因此,要将其存储在会话状态中,您必须将数据读入自己的对象中,然后保存(例如)。或者干脆不要尝试使用会话状态来“持久化”这些对象,因为通常您不想这样做(没有最佳实践)。
发布于 2013-09-22 03:14:15
一个最简单、最好的解决方案是使用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);有关更多信息,请参阅以下两个链接:
(1) http://james.newtonking.com/projects/json-net.aspx
2.) http://www.codeplex.com/json/
如果应用程序使用的是in-process状态管理,则可以将LINQ对象存储在会话、应用程序和缓存中。但是,您将无法将它们存储在视图状态中。
原因是存储在视图状态中的数据是使用二进制格式化程序序列化的。
因此,另一个解决方案是使LINQ类可序列化,您需要用NonSerialized属性标记所有System.Data.Linq.EntitySet和System.Data.Linq.EntityRef字段,用Serializable属性标记LINQ类。
另一种解决方案是手动从LINQ对象中提取数据,将其存储为某种中间格式(class、struct、.等)然后手动地把它转换回来。
https://stackoverflow.com/questions/18938127
复制相似问题