我们有一个Web应用程序,它经常使用缓存内存中的数据进行存储。之前它是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; }
}
}
有谁知道如何解决这个问题......?感谢。
答案 0 :(得分:1)
对象以序列化形式存储在AppFabric缓存中。这意味着每个对象都必须是Serializable。 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;
}