问题:当缓存一个类的实例并立即将其从缓存中取回时,我得到了对象(它不是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);
}
}
对象如何使用二进制格式化程序正确地序列化和反序列化,而不是通过缓存完全相同的事情?
有没有人遇到过这个问题,或者有没有人对一般要注意的事项有任何建议或提示?
答案 0 :(得分:1)
好的发现了。
该对象实现了IXmlSerializable,因此AppFabric使用它来代替常规序列化。
通过XmlSerializer(而不是BinaryFormatter)运行它会提供与我遇到的相同的空字段。
似乎IXmlSerializable实现存在问题。
答案 1 :(得分:1)
我相信在序列化到Xml(使用IXmlSerializable)时,会忽略对象的私有字段,这可能是您在检索时对象不完整的原因。
使用二进制序列化将确保包含整个对象(包括对其他对象的引用)。
答案 2 :(得分:0)
您可能需要查看IDataCacheObjectSerializer
http://msdn.microsoft.com/en-us/library/windowsazure/hh552969.aspx
AppFabric Caching - Can I specify serialization style used for all objects?
(是的,我知道这个问题也是你的: - )