begin process at 2012 02 11 04:54:50
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Système

 > 

Fichier & Disque

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

jeudi 8 novembre 2007 à 10:03:02 | [c#][VS2003] Serialisation d'une collection personnalisé

cedkat

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()]

publicclass 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(){}

   publicint Add [..]
   p
ublicint IndexOf [..]
   publicvoid Insert [..] 
   publicvoid Remove [..]
   publicbool Contains [..]

   protectedoverridevoid OnInsert [...]
   protectedoverridevoid OnRemove [..]
   protectedoverridevoid OnSet [..]
   protectedoverridevoid 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)]
   publicvirtualvoid 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

jeudi 8 novembre 2007 à 11:36:22 | Re : [c#][VS2003] Serialisation d'une collection personnalisé

sebmafate

Membre Club Administrateur CodeS-SourceS
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]
jeudi 8 novembre 2007 à 14:27:24 | Re : [c#][VS2003] Serialisation d'une collection personnalisé

cedkat

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

jeudi 8 novembre 2007 à 14:29:56 | Re : [c#][VS2003] Serialisation d'une collection personnalisé

sebmafate

Membre Club Administrateur CodeS-SourceS
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]
jeudi 8 novembre 2007 à 14:58:33 | Re : [c#][VS2003] Serialisation d'une collection personnalisé

cedkat

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

jeudi 8 novembre 2007 à 23:35:07 | Re : [c#][VS2003] Serialisation d'une collection personnalisé

Nurgle

Membre Club Administrateur CodeS-SourceS
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++


Nurgle (Antoine) - MSP
vendredi 9 novembre 2007 à 08:33:56 | Re : [c#][VS2003] Serialisation d'une collection personnalisé

cedkat

Réponse acceptée !
Meric pour vos réponses.  Voilà ce que j'ai fait et ça a l'air de fonctionner correctement :

Pour la sérialisation :
publicvirtualvoid 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



Cette discussion est classée dans : collection, personnalisé, company, protectedoverridevoid, listperso


Répondre à ce message

Sujets en rapport avec ce message

La référence d'objet n'est pas définie à une instance d'un objet. [ par kinderman81 ] Salut,Je souhaite ajouter des objets "Concessionnaire" dans un vecteur ArrayList (qui est la liste des concessionnaires): Celui-ci est l'objet Collect Collection converter - Help [ par bucherb ] Hello la compagnie.Voila, j'ai un control self-made qui contient une collection, avec un CollectionConverter afin que le designer affiche au développe appeler les methodes d'une classe et remplir une collection en C# [ par chris81 ] j'ai creer une classe de carton et j'aimerai savoir comment il faut faire pour appeler mes methodes qui sont a l'interieur. et j'aimerai aussi savoir Collection [ par jeanajaccio ] Salut à tous,Je vais essayer d'expliquer ma demande le + simplement possible : je code un composant dans lequel je souhaite implémenter une collection Control personnalisé [ par Frederyck ] Bonjour,Alors mon soucis est le suivant:Voyez vous dans Visual Studio, dans la fenêtre Propriété d'un control serveur, par exemple Label, une des prop Collection de PictureBox [ par tfrancais ] Ca doit être une question de débutant mais comment fait-on pour créer une collection de PictureBox où chaque élèment possède un index.Est-ce qu'il exi Probleme de remplissage d'une DataGrid [ par oxboz ] Salut, Voila j'explique mon cas. J'ai une DataGrid qui pourra contenir de nombreuses lignes. (+ 50000) J'ai pour chaque ligne un objet avec un colle Curseur personnalisé et Windows 98 [ par Mitsukane ] Bonjour à tous,J'ai trouvé sur ce forum comment mettre ses images persos en curseur de souris. Tout marche bien, en tout cas sur Windows XP, car dès q Constructeur paramétré dans un contrôle personnalisé [ par bob94700 ] Bonjour,     Je voudrais créer un contrôle personnalisé avec un paramétre dans le constructeur. Problème : dans mon form, par défaut l'initialisation Supprimer un collection de ligne dans un datagrid [ par m0rph3us002 ] Bonsoirje cherche à supprimer plusieurs lignes selon un critere dans mon datagriden fait plus exactement ce serait une sorte de tri qui afficherait qu


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,482 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales