AppFabric缓存 – 对象的序列化和反序列化要求是什么?

问题:当缓存一个类的实例并立即将其从缓存中取回时,我得到了对象(它不是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 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(而不是BinaryFormatter)运行它会提供与我遇到的相同的空字段。

似乎IXmlSerializable实现存在问题。

我相信在序列化为Xml(使用IXmlSerializable)时,会忽略对象的私有字段,这可能是您的对象在检索时不完整的原因。

使用二进制序列化将确保包含整个对象(包括对其他对象的引用)。

您可能想要查看IDataCacheObjectSerializer

http://msdn.microsoft.com/en-us/library/windowsazure/hh552969.aspx

AppFabric缓存 – 我可以指定用于所有对象的序列化样式吗?

(是的,我意识到这个问题也是你的:-)