У меня есть набор объектов (объектов ViewModel, используемых для создания строго типизированных представлений), из которых я заполняю:
Внешние службы J2EE для динамического контента. Я использую LINQ2XML для чтения ответа XML, возвращенного службой J2EE, для заполнения моих объектов
Локальная БД для статического контента. Я в основном объединяю статический контент из локальной БД с динамическим контентом, возвращаемым сервисами J2EE. Я использую NHibernate и LINQ для этой операции.
Как только я заполню свои ViewModels всеми необходимыми данными, я планирую хранить их в SESSION (используя AppFabric для состояния сеанса вне процесса). У меня есть атрибут [Serializable]
для всех моих классов ViewModel, как это требуется, если я планирую хранить их в сеансе вне процесса. Однако я получаю следующее исключение:
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.
Stack Trace:
[SerializationException: Type 'System.Linq.Enumerable+WhereEnumerableIterator`1[[TrvCity.Services.ViewModels.ResortsView, TrvCity.Services, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' in Assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable.]
System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type) +9452985
System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context) +247
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() +160
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder) +218
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo) +388
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) +444
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck) +133
System.Web.Util.AltSerialization.WriteValueToStream(Object value, BinaryWriter writer) +1708
Я тщательно проверил все мои классы, и они отмечены как [Serializable]
. Для дальнейшей отладки я вручную (БЕЗ использования упомянутых выше шагов 1 и 2) заполнил их, используя MOCK DATA, и я могу поместить их в сессию, в этом случае я не получаю SerializationException. Я чувствую, потому что я использую LINQ (LINQ2XML и LINQ2Objects), чтобы заполнить их не нравится.
Буду признателен, если кто-нибудь подскажет мне, как решить эту проблему.
Вот фрагмент кода моих объектов / классов:
[Serializable]
public class ResortsView : SupplierView
{
public IList<ProductView> ResortProducts { get; set; }
public string CheckInTime { get; set; }
public string CheckOutTime { get; set; }
public virtual IList<ImageView> Images { get; set; }
}
[Serializable]
public class SupplierView
{
public string SupplierID { get; set; }
public string SupplierName { get; set; }
public string Description { get; set; }
public string Rating { get; set; }
public string URL { get; set; }
}
[Serializable]
public class ProductView
{
public string Code { get; set; }
public string Description { get; set; }
public decimal? Price { get; set; }
public ErrorView PricingError { get; set; }
}