反序列化System.Collections类型的对象.ArrayList- AppFabric缓存错误

本文关键字:ArrayList- AppFabric 缓存 错误 对象 System Collections 类型 反序列化 | 更新日期: 2023-09-27 18:14:29

我们有一个web应用程序,它在缓存内存中存储频繁使用的数据。
早期是HttpRuntime缓存,但后来迁移到AppFabric缓存。
迁移之后,在尝试将对象添加到缓存中时抛出以下错误:错误:

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

添加到HttpRuntime缓存仍在工作。但是对AppFabric缓存抛出上述错误。

向Cache中添加item的代码片段:

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; }
 }
}

谁知道如何解决这个问题......?谢谢。

反序列化System.Collections类型的对象.ArrayList- AppFabric缓存错误

对象以序列化的形式存储在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; 
}