Десериализация объекта типа System.Collections.ArrayList- AppFabric Cache Error

У нас есть веб-приложение, которое часто использует данные в кэш-памяти.
Раньше это был HttpRuntime Cache, но позже он перешел на AppFabric Cache.
После переноса возникает следующая ошибка при попытке добавить объект в кэш:
Ошибка:

System.Runtime.Serialization.SerializationException:
"There was an error deserializing the object of type 
System.Collections.ArrayList. No set method for property '' in type ''."

Добавление в HttpRuntime Cache все еще работает. А вот в AppFabric Cache выдает указанную выше ошибку.

Фрагмент кода для добавления элемента в кэш-память:

public static void Add(string pName, object pValue)
{
  //System.Web.HttpRuntime.Cache.Add(pName, pValue, null, DateTime.Now.AddSeconds(60), TimeSpan.Zero, System.Web.Caching.CacheItemPriority.High, null);
 appFabricCache.Add(pName, pValue);
}

Экземпляр следующего класса пытается сохранить в кэш-памяти.

 public class Kernel
 {
 internal const BusinessObjectSource BO_DEFAULT_SOURCE=BusinessObjectSource.Context;
 private System.Collections.ArrayList mProcesses = new System.Collections.ArrayList();
 private System.Collections.Hashtable mProcessesHash = new System.Collections.Hashtable();

 public SnapshotProcess mSnapShotProcess ;
 private System.Collections.ArrayList mErrorInformation;

 public Collections.ArrayList Processes
 {
   get { return mProcesses; }
 }
}

Кто-нибудь знает, как решить эту проблему ......? Спасибо.


person Sunil    schedule 20.05.2013    source источник


Ответы (1)


Объекты хранятся в кэше AppFabric в сериализованной форме. Это означает, что все объекты должны быть сериализуемыми. AppFabric внутри использует NetDataContractSerializer.

При работе с HttpRuntime Cache в кэше сохраняется только ссылка, а объекты не сериализуются.

System.Collections.ArrayList (очень старый класс) сериализуем, но все вложенные/дочерние классы тоже должны быть сериализуемыми. Поэтому измените свой код (ядро и вложенный/дочерний тип) таким образом.

Вот фрагмент кода для тестирования сериализации без AppFabric.

// requires following assembly references:
//
//using System.Xml;
//using System.IO;
//using System.Runtime.Serialization;
//using System.Runtime.Serialization.Formatters.Binary;
//
// Target object “obj”
//
long length = 0;

MemoryStream stream1 = new MemoryStream();
using (XmlDictionaryWriter writer = 
    XmlDictionaryWriter.CreateBinaryWriter(stream1))
{
    NetDataContractSerializer serializer = new NetDataContractSerializer();
    serializer.WriteObject(writer, obj);
    length = stream1.Length; 
}
person Cybermaxs    schedule 21.05.2013
comment
Спасибо @Cybermaxs. Очень очень полезная информация. Если у нас есть возможность редактировать исходный класс и мы можем украсить этот класс атрибутом Serializable, это решит проблему...? - person Sunil; 21.05.2013
comment
NetDataContractSerializer можно использовать для любого типа, помеченного атрибутом DataContractAttribute или SerializableAttribute, или для типов, реализующих интерфейс ISerializable. Итак, у вас есть три варианта! - person Cybermaxs; 21.05.2013