[c#][VS2003] Serialisation d'une collection personnalisé

Résolu
cs_cedkat Messages postés 172 Date d'inscription mardi 7 janvier 2003 Statut Membre Dernière intervention 3 juin 2011 - 8 nov. 2007 à 10:03
cs_cedkat Messages postés 172 Date d'inscription mardi 7 janvier 2003 Statut Membre Dernière intervention 3 juin 2011 - 9 nov. 2007 à 08:33
Bonjour,

J'ai un petit souci, je ne sais pas comment sérialisé en binaire une collection pesonnalisée en utlisant la sérialisation personnalisé.
Voici ma classe :

[Serializable()]

public
class ListPerso : CollectionBase, ISerializable{

   private Company F_Company =
null;

   public ListPerso
this[
int index]{

      get{return List[index]
as Correspondant;}
      
set{List[index] =
value;}
   }

   public Company Compagnie{

      get{return F_Company;}

      set{
F_Company =
value;}
   }

   public CorrespondantList(){}

   public
int Add [..]
   p
ublic
int IndexOf [..]

   public
void Insert [..] 

   public
void Remove [..]

   public
bool Contains [..]

   protected
override
void OnInsert [...]
   protected
override
void OnRemove [..]

   protected
override
void OnSet [..]

   protected
override
void OnValidate [..]

   // Constructeur spécifique à la désérialisation, permettant ainsi de contrôler les informations à déserialiser.
   protected ListPerso (SerializationInfo info, StreamingContext context) 

   {
      ???

   }

   // Méthode spécifique à la sérialisation, permettant ansi de contrôler les informations à serialiser.
   [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter =
false)]

   public
virtual
void GetObjectData(SerializationInfo info, StreamingContext context)
   {

      ????
   }
}

Voilà, je ne sais pas quoi mettre à la place des points d'inérogation afin de sérialisé le champs "F_Company " ainsi que les éléments de la collection.

Merci 
Phoenix

6 réponses

cs_cedkat Messages postés 172 Date d'inscription mardi 7 janvier 2003 Statut Membre Dernière intervention 3 juin 2011
9 nov. 2007 à 08:33
Meric pour vos réponses.  Voilà ce que j'ai fait et ça a l'air de fonctionner correctement :

Pour la sérialisation :
public
virtual
void GetObjectData(SerializationInfo info, StreamingContext context)
{
   info.AssemblyName = "MonAssembly";
   info.AddValue("Compagnie",
this.F_Company);
   info.AddValue("List",
this.InnerList,
this.InnerList.GetType());
}

Pour la désérialisation :

protected ListPerso(SerializationInfo info, StreamingContext context)
{
   SerializationInfoEnumerator enuminfo = info.GetEnumerator() ;

   while (enuminfo.MoveNext())
   {

      if (enuminfo.Name == "Compagnie") 
         F_Company = enuminfo.Value
as Company;

      if (enuminfo.Name == "List") 
      {
         ArrayList lst = enuminfo.Value
as ArrayList;

         foreach( Correspondant c
in lst)

            this.Add(c);
      }
   }
}
Voilà et encore merci pour votre aide.

Phoenix
3
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
8 nov. 2007 à 11:36
As-tu toujours simplement essayé de faire :

Pour la sérialisation :
public void Serialize() {
    FileStream fs = new FileStream("c:\\monObjet.bin", FileMode.Create);
    BinaryFormatter bf = new BinaryFormatter();
    try {
        bf.Serialize(fs, this);
    } catch (SerializationException e) {
       Console.WriteLine("Erreur pendant la sérialisation : " + e.Message);
       throw;
    } finally {
       fs.Close();
    }
}

pour la Désérialisation :
public void Deserialize() {
    FileStream fs = new FileStream("c:\\monObjet.bin", FileMode.Open);
    try {
       BinaryFormatter bf = new BinaryFormatter();
       this = (MonType)formatter.Deserialize(fs);
    } catch (SerializationException e) {
       Console.WriteLine("Erreur pendant la désérialisation : " + e.Message);
       throw;
    } finally {
       fs.Close();
    }
}

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
0
cs_cedkat Messages postés 172 Date d'inscription mardi 7 janvier 2003 Statut Membre Dernière intervention 3 juin 2011
8 nov. 2007 à 14:27
Bonjour,

Merci, mais le problème n'est pas de sérialisé l'objet dans un fichier mais bien de contrôler la facon de je veux sérialiser une collection personnalisé.

Phoenix
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
8 nov. 2007 à 14:29
Tu ne peux pas personnaliser la serialisation binaire... en binaire, tu sérialises tout l'objet

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cedkat Messages postés 172 Date d'inscription mardi 7 janvier 2003 Statut Membre Dernière intervention 3 juin 2011
8 nov. 2007 à 14:58
Bien sûr que si, tu peux contrôler la façon dont tes objest vont se sérialisé.
Il faut pour cela que l'objet implémente l'interface ISerializable et ensuite implémenter les fonctions :
-

GetObjectData (SerializationInfo info, StreamingContext context) --> pour la sérialisation
- un constructeur avec la signature suivante :


protected MonObjet(SerializationInfo info, StreamingContext context)  --> pour la désérialisation .
(voir mon exemple de classe plus haut)


Tu peut ainsi redéfinir le nom de l'assembly des tes objets pour permettre la compatibilité du fichier en fonction de tes version d'assembly car par défaut la sérialization native indique la version de l'assembly.

Donc, pour en revenir à mon cas, ici le problème que je rencontre, c'est que je veux sérilisé une collection fortement typé et donc, je vois pas quoi mettre dans les dites méthodes.



Phoenix
0
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
8 nov. 2007 à 23:35
Bonjour,
Un petit exemple simple, si tu as un seul champ dans ton objet à sérialiser :
public string maChaine = "toto";
'Tu peux définir ce que tu veux sérialiser et sous quelle forme en utilisant SerializationInfo.AddValue :
void GetObjectData (SerializationInfo info, StreamingContext context) ...
{
   info.AddValue("maChaine", maChaine);
}
' Et lors du rechargement de l'objet tu peux utiliser SerializationInfo.GetString ou plus généralement SerializationInfo.GetValue :
MonObjet(SerializationInfo info, StreamingContext context)
{
   this.maChaine = info.GetString("maChaine");
}

En gros ça te permet de ne sérialiser que certains membres, certaines variables, etc... et également de contrôler ce qui devra être fait ou ne pas fait lors du rechargement de l'objet.

Comme dans ton cas tu as une collection, tu peux stocker indépendamment chaque objet de ta collection, ou stocker un tableau d'objet, ou ce que tu veux...
Par contre je vois pas en quoi le fait que ta collection soit fortement typée change quoi que ce soit... tu auras juste un Cast à faire quand tu récupèreras tes données lors de la dé-sérialisation.

Bonne soirée,
A++

<hr width="100%" size="2" />Nurgle (Antoine) - MSP
0
Rejoignez-nous