2010-09-17 4 views
3

Problème: Lors de la mise en cache d'une instance d'une classe et de sa sortie immédiate du cache, je récupère l'objet (son non null), mais toutes ses propriétés/champs sont NULL ou par défaut.AppFabric Caching - Quelles sont ses exigences de sérialisation et de désérialisation pour un objet?

_cacheHelper.PutInCache("testModuleControlInfoOne", mci); 
    //mci has populated fields 

    var mciFromCacheOne = _cacheHelper.GetFromCache("testModuleControlInfoOne"); 
    //mciFromCacheOne now has null or default fields 

Je soupçonne la façon dont l'objet est structuré est le problème et AppFabric ne sérialisation l'objet correctement pour une raison quelconque. Cependant, lorsque j'utilise la méthode de sérialisation suivante, je récupère l'objet avec toutes les propriétés/champs tels qu'ils étaient avant la sérialisation.

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); 
      } 
    } 

Comment un serialize objet et désérialiser correctement en utilisant le formatter binaire et ne pas faire exactement la même chose via la mise en cache?

Est-ce que quelqu'un a rencontré cela ou est-ce que quelqu'un a des suggestions ou des conseils sur ce qu'il faut généralement faire attention?

+0

réponse à la question similaire posté ici: http://stackoverflow.com/questions/3756480/appfabric-caching-can-i-specify-serialization- style-used-for-all-objects/8195002 # 8195002 – kenster

Répondre

0

Ok l'a trouvé.

L'objet implémenté IXmlSerializable a été utilisé par AppFabric à la place de la sérialisation standard.

L'exécution à travers un XmlSerializer (au lieu d'un BinaryFormatter) donne les mêmes champs nuls que je connaissais.

Il semble que l'implémentation IXmlSerializable ait des problèmes.

+0

Pas de problèmes. Spécification connue – andrewbadera

+0

@andrewbadera - non, par des problèmes Je faisais référence à la façon dont l'implémentation personnalisée de IXmlSerializable sur une classe a été mal réalisée par un développeur. – CRice

+0

Quelqu'un veut m'expliquer quel est le problème? – CRice

1

Je crois que lors de la sérialisation en Xml (en utilisant IXmlSerializable), les champs privés d'un objet sont ignorés, ce qui peut expliquer pourquoi votre objet était incomplet lors de la récupération. L'utilisation de la sérialisation binaire garantit l'inclusion de l'objet entier (y compris les références à d'autres objets).

+0

Encore pire, c'est une classe dans une DLL je ne peux pas modifier avec une mauvaise implémentation IXmlSerializable. Savez-vous si AppFabric peut être configuré pour ignorer IXmlSerializable et toujours utiliser la sérialisation binaire? – CRice

Questions connexes