Reputation: 3298
I m getting following error and wondering if we can make System.Data.Linq.EntitySet serializable
Unable to serialize the session state. In 'StateServer' and 'SQLServer' mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in 'Custom' mode.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Web.HttpException: Unable to serialize the session state. In 'StateServer' and 'SQLServer' mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in 'Custom' mode.
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
[SerializationException: Type 'System.Data.Linq.EntitySet`1[[NES.HiLo.Data.DAO.UserResource, NES.HiLo.Data, Version=1.0.5012.39381, Culture=neutral, PublicKeyToken=null]]' in Assembly 'System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable.] 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
Upvotes: 3
Views: 12644
Reputation: 13390
Actually, the exception already tells you what the issue is - EntitySet is not serializable. Therefore, it cannot be stored in session state if you use the session DB feature.
EntitySet does not implement/support this. Therefore, to store it in the session state, you would have to read the data into your own objects and then save it for example. Or simply do not try to use session state to "persist" those kind of objects because usually you don't want to do this (no best practice).
Upvotes: 7
Reputation: 10565
One easiest & one of the best solution is to use Json.NET
library.
This library allows you to do bidirectional transformation of LINQ
objects to their JSON
representation.
For example, you can store the product in the view state , with just few lines of code:
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 ;
and retrieve it back too :
product = JsonConvert.DeserializeObject<Product>(ViewState["product"] as string);
Refer these 2 links for more:
1.) http://james.newtonking.com/projects/json-net.aspx
2.) http://www.codeplex.com/json/
if your application is using in-process
state management, you'll be able to store LINQ objects in Session, Application and Cache. However you won't be able to store them in the view state.
The reason is that the data stored in the view state is serialized using a binary formatter.
Therefore one more solution is to make the LINQ
class serializable, you'll need to mark all System.Data.Linq.EntitySet
and System.Data.Linq.EntityRef
fields with NonSerialized
attribute and to mark with Serializable
attribute the LINQ
class.
And yet another solution is to manually extract data from the LINQ
objects, store it to some intermediate format (class
, struct
,... etc.) and later manually transform it back.
Upvotes: 3