AppFabricキャッシング - オブジェクトのシリアル化と敏aserializationの要件は何ですか?
-
03-10-2019 - |
質問
問題:クラスのインスタンスをキャッシュしてすぐにキャッシュを取り戻すと、オブジェクトを取り戻します(nullではありません)が、そのプロパティ /フィールドはすべてnullまたはデフォルトです。
_cacheHelper.PutInCache("testModuleControlInfoOne", mci);
//mci has populated fields
var mciFromCacheOne = _cacheHelper.GetFromCache("testModuleControlInfoOne");
//mciFromCacheOne now has null or default fields
したがって、オブジェクトの構造化方法が問題であり、AppFabricが何らかの理由でオブジェクトを適切にシリアル化していないと思います。
ただし、次のシリアル化方法を使用すると、シリアル化前と同じようにすべてのプロパティ /フィールドでオブジェクトを取り戻します。
public T SerializeThenDeserialize<T>(T o) where T : class
{
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
{
bf.Serialize(ms, o);
ms.Position = 0;
return (T)bf.Deserialize(ms);
}
}
オブジェクトは、バイナリフォーマッタを使用して適切にシリアル化し、脱必要になり、キャッシングを介してまったく同じことをしないにはどうすればよいですか?
誰かがこれに出会ったことがありますか、それとも誰かが一般的に何を注意するべきかについて何か提案やヒントを持っていますか?
解決
わかりました、それを見つけました。
オブジェクトはixmlserializableを実装したため、Appfabricは通常のシリアル化の代わりにそれを使用しました。
XmlSerializerを介して(バイナリフォーマットの代わりに)実行していると、私が経験していたのと同じヌルフィールドが得られます。
IXMLSerializableの実装には問題があるようです。
他のヒント
XMLにシリアル化すると(IXMLSerializableを使用)、オブジェクトのプライベートフィールドは無視されていると思います。
バイナリシリアル化を使用すると、オブジェクト全体(他のオブジェクトへの参照を含む)が含まれます。
あなたは見たいかもしれません IDataCacheObjectSerializer
http://msdn.microsoft.com/en-us/library/windowsazure/hh552969.aspx
AppFabricキャッシュ - すべてのオブジェクトに使用されるシリアル化スタイルを指定できますか?
(はい、私はこの質問もあなたのものだと気づきます:-)