2

頻繁に使用するデータをキャッシュ メモリに保存する 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 キャッシュへの追加はまだ機能しています。しかし、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; }
 }
}

この問題を解決する方法を知っている人はいますか......?ありがとう。

4

1 に答える 1

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; 
}
于 2013-05-21T07:40:06.537 に答える