无法使用状态服务器序列化会话状态

问题描述 投票:0回答:2

我收到以下错误,想知道我们是否可以使 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.Data.DAO.UserResource, 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.InternalGetSerializingMembers(RuntimeType 类型)+7738715 System.Runtime.Serialization.FormatterServices.GetSerializedMembers(类型类型,StreamingContext上下文)+258 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() +111 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(对象obj,ISurrogateSelector surrogateSelector,StreamingContext上下文,SerObjectInfoInit serObjectInfoInit,IFormatterConverter转换器,ObjectWriter objectWriter)+422 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(对象obj,ISurrogateSelector surrogateSelector,StreamingContext上下文,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(对象图,Header[] inHeaders,__BinaryWriter serWriter,布尔值fCheck)+461 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(流序列化流,对象图,Header[]标头,布尔fCheck)+134 System.Web.Util.AltSerialization.WriteValueToStream(对象值,BinaryWriter编写器)+1577

c# asp.net serialization
2个回答
7
投票

实际上,异常已经告诉您问题是什么 - EntitySet 不可序列化。因此,如果使用会话数据库功能,则无法将其存储在会话状态中。

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


3
投票

最简单且最好的解决方案之一是使用

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 对象。但是,您将无法将它们存储在视图状态中。

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

因此,另一种解决方案是使

LINQ
类可序列化,您需要使用
System.Data.Linq.EntitySet
属性标记所有
System.Data.Linq.EntityRef
NonSerialized
字段,并使用
Serializable
属性标记
LINQ
类。

另一种解决方案是手动从

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

© www.soinside.com 2019 - 2024. All rights reserved.