3

问题:当缓存一个类的实例并立即将其从缓存中取回时,我将对象取回(它不是 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);
            }
    }

对象如何使用二进制格式化程序正确序列化和反序列化,而不是通过缓存做完全相同的事情?

有没有人遇到过这种情况,或者有没有人对一般要注意的事项有任何建议或提示?

4

3 回答 3

1

好的,找到了。

该对象实现了 IXmlSerializable,因此 AppFabric 使用它而不是常规序列化。

通过 XmlSerializer(而不是 BinaryFormatter)运行它会提供与我遇到的相同的空字段。

似乎 IXmlSerializable 实现存在问题。

于 2010-09-17T02:02:05.033 回答
1

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

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

于 2010-09-17T13:25:29.680 回答
0

你可能想看看IDataCacheObjectSerializer

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

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

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

于 2013-02-23T06:37:57.360 回答