Probleme de Serialisation d'un usercontrol

tkd1984 Messages postés 12 Date d'inscription lundi 15 janvier 2007 Statut Membre Dernière intervention 10 mars 2009 - 1 janv. 2008 à 21:25
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 - 26 janv. 2008 à 21:32
Bonjour a tous le monde
j'aimerais serialiser un usercontrol qui porte le nom "Table",voici les propriétés de la classe qui le représente:
//nom pour la table graphiquement
private String tableName;
public String nomTable
{
get { return tableName; }
set { tableName = value; }
}
//nom pour la table ds le programme
private String table_Name;
public String nom_Table
{
get { return table_Name; }
set { table_Name = value; }
}

private List listattributs = new List();
public List Details
{
get { return listattributs; }
set { listattributs = value; }
}
lors de l'execution j'ai le message d'erreur suivant:
Une erreur s'est produite lors de la réflexion du type'MiniAgl.Table'
et merci d'avance

15 réponses

tkd1984 Messages postés 12 Date d'inscription lundi 15 janvier 2007 Statut Membre Dernière intervention 10 mars 2009
1 janv. 2008 à 21:32
execusez moi je n'arrive pas a saisir correctement mon message surtout le code,je sais pas ou il est le probléme!!!
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
1 janv. 2008 à 23:44
Salut,

Si tu utilises un navigateur du genre Opera, il se peut que les sauts de lignes sautent.
Passe par la textbox "classique" (voir lien en bas) ou par FireFox ou Internet Explorer.

/*
coq
MVP Visual C#
CoqBlog
*/
0
tkd1984 Messages postés 12 Date d'inscription lundi 15 janvier 2007 Statut Membre Dernière intervention 10 mars 2009
2 janv. 2008 à 00:29
Bonjour,
oui c'est juste c'est navigateur Opera,On recomence a nouvau:

 j'aimerais serialiser un usercontrol qui porte le nom "Table",voici les propriétés de la classe qui le représente:

//nom pour la table graphiquement
privateString tableName;
publicString nomTable

      get { return tableName; } 
      set { tableName = value; }
}
//nom pour la table ds le programme

private String table_Name;
public String nom_Table
{
    get { return table_Name; } 
    set { table_Name = value; }
}
 
privateList listattributs = new List();
publicList Details
{
       get { return listattributs;}
       set { listattributs = value; }
}
lors de l'execution j'ai le message d'erreur suivant:

Une erreur s'est produite lors de la réflexion du type'MiniAgl.Table'

et merci d'avance
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
2 janv. 2008 à 10:28
Qu'entend tu par UserControl ? Réellement une classe héritant de la classe UserControl ?
Sinon détaille l'erreur (ne zappe pas le type de l'exception notamment), mais à vue de nez c'est un problème que l'on a quand la classe a sérialiser ne possède pas de constructeur par défaut.

/*
coq
MVP Visual C#
CoqBlog
*/
0

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

Posez votre question
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
2 janv. 2008 à 14:43
Hi,
S'il s'agit de Serializer un UserControl, ce n'est pas possible, cette classe n'étant pas marquée [Serializable]
Il faut alors implémenter son propre Serializer ou séparer clairement la partie UI/Data pour ne Serializer que les data.

<hr />
-My Blog-
0
tkd1984 Messages postés 12 Date d'inscription lundi 15 janvier 2007 Statut Membre Dernière intervention 10 mars 2009
2 janv. 2008 à 18:02
salut,
merci de vos réponses. Quand j'ai affiché le code de mon UserControl pour la première fois, ça m'a donné :

public
partial
class
Table :
UserControl
{
      
public Table()
      {
            InitializeComponent();
      }

}

donc ma classe possède un constructeur par défaut(en réponse à coq). 


maintenant, je voudrais savoir ce que tu  entends Bidou par "implémenter son propore Serializer" ?
Merci
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
2 janv. 2008 à 19:32
Il faut voir avec l'implémentation de l'interface ISerializable
http://msdn2.microsoft.com/en-us/library/ty01x675(VS.85).aspx

<hr />
-My Blog-
0
tkd1984 Messages postés 12 Date d'inscription lundi 15 janvier 2007 Statut Membre Dernière intervention 10 mars 2009
7 janv. 2008 à 23:52
bonjour a tous le monde
et merçi "Bidou" pour votre aide ;j'ai enfin arriver a une solution aprés une long et dire recherche,voila la solution:
Dans la classe "Table" qui hérite de Usercontrole j'ai implemente 3 methods :
public System.Xml.Schema.XmlSchema GetSchema()
        {
            return null;
        }
public void ReadXml(System.Xml.XmlReader reader)
        {
            //Pas encor programmer
        }

public void WriteXml(System.Xml.XmlWriter writer)
        {
                int i = 0;

                writer.WriteStartDocument();

                writer.WriteStartElement("Table");

                writer.WriteElementString("NomTable", nomTable);
                writer.WriteElementString("Nom_Table", nom_Table);

                writer.WriteStartElement("Attributs");

                foreach (Attributs val in Details)
                {
                    writer.WriteStartElement("Attribut" + i);
                    writer.WriteElementString("ClePrimaire",                           Convert.ToString(val.clePrimaire));
                    writer.WriteElementString("NomAttribut", val.nomAttribut);
                    writer.WriteElementString("TypeAttribut", val.typeAttribut);
                    writer.WriteElementString("CleEtranger", Convert.ToString(val.cleEtrangere));
                    writer.WriteEndElement(); // close Items tag
                    i++;
                }

                writer.WriteEndElement(); // close Items tag
                writer.WriteEndElement(); // close Items tag
                writer.WriteEndDocument();
                writer.Flush();
                writer.Close();
}
et les lignes d'appel du form1 c'est:
foreach (Table tbl in this.panel1.Controls)
                    {
                        XmlTextWriter writer = new XmlTextWriter(sfdEnregistrer.FileName, null);
                        writer.Formatting = Formatting.Indented;
                        tbl.WriteXml(writer);                    
                    }
Le probléme c'est que si exists 2 tables dans le "panel1.controls" il écrase les précedents, donc il reste dans le fichier les donnes de la dernier table parcourit.
Exist-il une fonction pour ouvrir le fichier xml en mode ajoute,
car je cherche partout ,j'essai XmlDocument c'est le meme probléme
et merci d'avance...
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
8 janv. 2008 à 00:17
Un fichier XML devant garder une certaine structure, il n'est pas directement possible d'ajouter des données à la suite comme dans un fichier texte par exemple.
On peut alors passer par un XmlDocument qui se chargera d'updater le DOM de façon à conserver une structure consistante. Voir les méthodes AppendChild & Co de la classe XmlDocument.

<hr />
-My Blog-
0
tkd1984 Messages postés 12 Date d'inscription lundi 15 janvier 2007 Statut Membre Dernière intervention 10 mars 2009
8 janv. 2008 à 01:14
merçi bouceaup pour votre reponce
j'ai une question:
maintenant que j'utilise XmlDocument je travaille pas avec IXMLSerializable (XmlReader-XmlWriter)je travaille seulement avec XmlDocument si je trompe,
et merci d'avance
0
don3omario Messages postés 7 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 27 janvier 2008
26 janv. 2008 à 18:05
slt a tt le monde, reponse a "bidou" :
pourrais-tu nous expliquer ce que t'as voulu dire par " Il faut alors implémenter son propre Serializer ou séparer clairement la partie UI/Data pour ne Serializer que les data"
comment on fait pour separer la partie UI/Data ?

Merci d'avance
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
26 janv. 2008 à 18:47
Une bonne partie des objets qui se trouvent par exemple dans System.Drawing ne sont pas Serializable.
Parfois, on a pas besoin de connaître l'état exacte d'un objet, mais seulement quelques éléments de celui-ci. Il s'agit alors de ne s'occuper que de ces éléments là.

Pour un UserControl, typiquement, est-il vraiment nécessaire de tout Serialiser? Certainement que non. Surtout qu'un UserControl peut-être très complexe, ce qui donner un fichier binaire (ou xml) très gros (donc potentiellement très lent à écrire/lire/transmettre).

Il s'agit donc de s'intéresser uniquement aux attributs qui nous intéresse. C'est ce que je voulais dire par cette phrase...

<hr />
-My Blog-
0
don3omario Messages postés 7 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 27 janvier 2008
26 janv. 2008 à 19:11
Très bien expliqué, merci
0
don3omario Messages postés 7 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 27 janvier 2008
26 janv. 2008 à 21:02
slt a tt le monde
voici mon pb : j'ai une classe qui s'appelle projet, qui a comme proprietes nom et une liste de tables ( table est aussi une classe).
j'aimerais savoir comment s'appelle la fct qui indique dans mon cas : projet courant  pour  ne pas tomber dans le pb de l'initialisation.
msg d'erreur : Use of unassigned local variable 'p'  

merci d'avance
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
26 janv. 2008 à 21:32
Merci de poser ta question dans un nouveau thread:
http://www.csharpfr.com/infomsg.aspx?ajout=1

<hr />
-My Blog-
0
Rejoignez-nous