2010-09-17 68 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