3

我收到以下错误,想知道我们是否可以使 System.Data.Linq.EntitySet 可序列化

无法序列化会话状态。在“StateServer”和“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许不可序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“自定义”模式下完成类似的序列化,则适用相同的限制。

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Web.HttpException:无法序列化会话状态。在“StateServer”和“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许不可序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“自定义”模式下完成类似的序列化,则适用相同的限制。

源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

堆栈跟踪:

[SerializationException:在程序集中键入 'System.Data.Linq.EntitySet`1[[NES.HiLo.Da​​ta.DAO.UserResource,NES.HiLo.Da​​ta,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 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 转换器,ObjectWriter objectWriter) +422 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter 转换器, 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) +1577BinaryWriter 作家)+1577

4

2 回答 2

7

该异常实际上已经告诉您问题所在,EntitySet 不可序列化。因此,如果您使用会话数据库功能,它不能存储在会话状态中。

EntitySet 不实现/支持这一点。因此,要将其存储在会话状态中,您必须将数据读入您自己的对象中,然后保存。或者干脆不要尝试使用会话状态来“持久化”那些对象,因为通常你不想这样做(没有最佳实践)。

于 2013-09-21T22:32:42.983 回答
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状态管理,您将能够将 LINQ 对象存储在 Session、Application 和 Cache 中。但是,您将无法将它们存储在视图状态中。

原因是视图状态中存储的数据是使用二进制格式化程序序列化的。

因此,另一种解决方案是使LINQ类可序列化,您需要用属性标记所有字段并用System.Data.Linq.EntitySet属性标记类。System.Data.Linq.EntityRefNonSerializedSerializableLINQ

另一种解决方案是手动从LINQ对象中提取数据,将其存储为某种中间格式(class, struct,... 等),然后手动将其转换回来。

于 2013-09-22T03:14:15.647 回答