无法使用stateserver序列化会话状态

时间:2013-09-21 22:01:29

标签: c# asp.net serialization

我收到以下错误,想知道我们是否可以使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.Da​​ta.DAO.UserResource,NES.HiLo.Da​​ta,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

2 个答案:

答案 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.EntityRefNonSerialized字段并标记为{ {1}}属性Serializable类。

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