AppFabric缓存 - 其对象的序列化和应有的要求是什么?
-
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(而不是二进制Formatter)运行它,给出了与我所经历相同的空字段。
IXMLSerializable实施似乎存在问题。
其他提示
我相信,当序列化XML(使用IXMLSerializable)时,对象的私有字段被忽略,这可能就是为什么您的对象在检索时不完整的原因。
使用二进制序列化将确保包括整个对象(包括对其他对象的引用)。
你可能想看看 IDataCacheObjectSerializer
http://msdn.microsoft.com/en-us/library/windowsazure/hh552969.aspx
AppFabric缓存 - 我可以指定用于所有对象的序列化样式吗?
(是的,我意识到这个问题也是你的:-)
不隶属于 StackOverflow