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

cs_cedkat 172 Messages postés mardi 7 janvier 2003Date d'inscription 3 juin 2011 Dernière intervention - 8 nov. 2007 à 10:03 - Dernière réponse : cs_cedkat 172 Messages postés mardi 7 janvier 2003Date d'inscription 3 juin 2011 Dernière intervention
- 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
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
cs_cedkat 172 Messages postés mardi 7 janvier 2003Date d'inscription 3 juin 2011 Dernière intervention - 9 nov. 2007 à 08:33
3
Merci
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

Merci cs_cedkat 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de cs_cedkat
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 8 nov. 2007 à 11:36
0
Merci
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]
Commenter la réponse de sebmafate
cs_cedkat 172 Messages postés mardi 7 janvier 2003Date d'inscription 3 juin 2011 Dernière intervention - 8 nov. 2007 à 14:27
0
Merci
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
Commenter la réponse de cs_cedkat
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 8 nov. 2007 à 14:29
0
Merci
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]
Commenter la réponse de sebmafate
cs_cedkat 172 Messages postés mardi 7 janvier 2003Date d'inscription 3 juin 2011 Dernière intervention - 8 nov. 2007 à 14:58
0
Merci
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
Commenter la réponse de cs_cedkat
cs_Nurgle 1648 Messages postés samedi 6 novembre 2004Date d'inscription 28 avril 2011 Dernière intervention - 8 nov. 2007 à 23:35
0
Merci
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
Commenter la réponse de cs_Nurgle

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.