Исключение сериализации при использовании LINQ для заполнения объектов (ASP.NET MVC2) - PullRequest
0 голосов
/ 18 апреля 2011

У меня есть набор объектов (объектов ViewModel, используемых для создания строго типизированных представлений), из которых я заполняю:

  1. Внешние службы J2EE для динамического контента. Я использую LINQ2XML для чтения ответа XML, возвращенного службой J2EE, для заполнения моих объектов

  2. Локальная БД для статического контента. Я в основном объединяю статический контент из локальной БД с динамическим контентом, возвращаемым сервисами 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; }
}

1 Ответ

2 голосов
/ 18 апреля 2011

Это, наверное, из-за ленивой загрузки. Попробуйте с нетерпением извлечь коллекцию, прежде чем пытаться сохранить ее в сеансе:

IEnumerable<ResortsView> resortsViews = ...
Session["resortsViews"] = resortsViews.ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...