2010-09-17 55 views
3

问题:当缓存一个类的实例并立即将它从缓存中取出时,我得到对象(它不为空),但是它的所有属性/字段都是空值或默认值。AppFabric缓存 - 对象的序列化和反序列化要求是什么?

_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

回答此处发布的类似的问题: http://stackoverflow.com/questions/3756480/appfabric-caching-can-i-specify-serialization- style-used-for-all-objects/8195002#8195002 – kenster 2011-11-19 15:29:34

回答

0

好的发现它。

该对象实现了IXmlSerializable,因此AppFabric使用该对象来代替常规序列化。

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

看来IXmlSerializable实现有问题。

+0

没问题。已知规格 – andrewbadera 2011-04-27 21:45:54

+0

@andrewbadera - 不,我遇到的问题是指开发人员如何在一个类上自定义实现IXmlSerializable。 – CRice 2011-04-27 23:25:21

+0

有人想向我解释这是什么问题? – CRice 2012-06-26 11:56:28

1

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

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

+0

更糟糕的是,它的一个类在一个DLL我不能改变与可怜的IXmlSerializable实现。你知道AppFabric是否可以配置为忽略IXmlSerializable并且始终使用二进制序列化? – CRice 2010-09-21 00:04:35

相关问题