IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Serialisation problématique incompréhensible


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 134
    Par défaut Serialisation problématique incompréhensible
    Bonjour à tous,

    JE rencontre un problème actuellement avec une sérialisation xml. Le message d'erreur est : System.Reflection.TargetParameterCountException: Le nombre de paramètres spécifié ne correspond pas au nombre attendu.

    Je ne comprend pas d'ou peux venir le problème: voici les sources utlisés:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    	[Serializable]
    	public class ItemConfig<T> : IItemConfig
    	{
     
    		public T Valeur{
    			get;
    			set;
    		}
     
    		[XmlAttribute]
    		public T Defaut{
    			get;
    			set;
    		}
     
    		public ItemConfig()
    		{ }
    	}
     
            [Serializable]
    	public class CfgSection
    	{
    		private string _sectionName = "";
    		private IList<IItemConfig> _lst = new List<IItemConfig>();
     
    		[XmlAttribute]
    		public string Name{
    			get { return _sectionName; }
    			set { _sectionName = value; }
    		}
     
    		public IList<IItemConfig> Items{
    			get { return _lst; }
    			set {_lst = value; }
    		}
     
    		public CfgSection()
    		{}
    	}
     
    	[ Serializable ]
    	public class AppConfig
    	{
    		private string _file = "";
    		private List<CfgSection> _sections = new List<CfgSection>();
     
     
    		public string FichierConfig
    		{
    			get { return _file; }
    		}
     
     
    		public List<CfgSection> Sections
    		{
    			get { return _sections; }
    			set { _sections = value; }
    		}
     
    		public AppConfig()
    		{}
    	}
    Avez vous une idées ou des conseils dans la résolution de ce problème?

    Merci pour votre aide.

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Je n'ai pas d'erreur avec ton code (mis à part IItemConfig qui n'existe pas), il serai bon que tu nous donne celui qui génère l'exception..

  3. #3
    Membre confirmé
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 134
    Par défaut
    Merci, voici le code complet de mon test. Un simple bouton dans une forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
     
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;
    using System.IO;
    using System.Xml.Serialization;
     
    namespace test
    {
    	/// <summary>
    	/// Description of MainForm.
    	/// </summary>
    	public partial class MainForm : Form
    	{
    		public MainForm()
    		{
    			//
    			// The InitializeComponent() call is required for Windows Forms designer support.
    			//
    			InitializeComponent();
     
    			//
    			// TODO: Add constructor code after the InitializeComponent() call.
    			//
    		}
    		void Button1Click(object sender, EventArgs e)
    		{
    			ItemConfig<bool> item = new ItemConfig<bool>();
    			item.Valeur = false;
    			item.Defaut = false;
     
    			ItemConfig<int> item1 = new ItemConfig<int>();
    			item1.Valeur = 0;
    			item1.Defaut = 10;
     
    			CfgSection sec = new CfgSection("name");
    			sec.Add(item);
     
    			CfgSection sec1 = new CfgSection("name");
    			sec1.Add(item);
     
    			AppConfig cfg = new AppConfig();
     
    			cfg.AddSection(sec);
    			cfg.AddSection(sec1);
     
    			string Path = Application.StartupPath;
    			Path = System.IO.Path.Combine(Path, "ConfigFile.xml");
     
    			Sauver.WriteDatasToFile(cfg, Path);
    		}
    	}
     
    	public interface IItemConfig{}
     
    	[Serializable]
    	public class ItemConfig<T> : IItemConfig
    	{
     
    		public T Valeur{
    			get;
    			set;
    		}
     
    		[XmlAttribute]
    		public T Defaut{
    			get;
    			set;
    		}
     
    		public ItemConfig()
    		{ }
    	}
     
        [Serializable]
    	public class CfgSection
    	{
    		private string _sectionName = "";
    		private IList<IItemConfig> _lst = new List<IItemConfig>();
     
    		[XmlAttribute]
    		public string Name{
    			get { return _sectionName; }
    			set { _sectionName = value; }
    		}
     
    		public IList<IItemConfig> Items{
    			get { return _lst; }
    			set {_lst = value; }
    		}
     
    		public CfgSection()
    		{}
     
    		public CfgSection(string name)
    		{
    			_sectionName = name;
    		}
     
    		public void Add(IItemConfig item)
    		{
    			_lst.Add(item);
    		}
    	}
     
    	[ Serializable ]
    	public class AppConfig
    	{
    		private string _file = "";
    		private List<CfgSection> _sections = new List<CfgSection>();
     
     
    		public string FichierConfig
    		{
    			get { return _file; }
    		}
     
     
    		public List<CfgSection> Sections
    		{
    			get { return _sections; }
    			set { _sections = value; }
    		}
     
    		public AppConfig()
    		{}
     
    		public void AddSection(CfgSection section)
    		{
    			_sections.Add(section);
    		}
    	}
     
    	public static class Sauver
    	{
    		public static bool WriteDatasToFile<T>(T obj, string fileName)
    		{
    			bool ret;
    			StreamWriter wr = null;
     
    			try
    			{			
    				XmlSerializer xs = new XmlSerializer(typeof(T));
    				using (wr = new StreamWriter(fileName))
    				{
    					xs.Serialize(wr, obj);
    					ret = true;
    				}	
    			}
    			catch (Exception e) { 
    				System.Windows.Forms.MessageBox.Show(e.Message);
    				ret = false; }
    			return ret;
    		}
    	}
    }
    Le code d'erreur est le suivant : System.Reflection.TargetParameterCountException: Le nombre de paramètres spécifié ne correspond pas au nombre attendu.

    Framework cible : .NET FrameWork 4.0

    Merci pour l'aide

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Le problème semble venir de la sérialisation de l'interface 'IItemConfig'.
    Si tu l'exclu tu n'a plus d'exception.
    Pour sérialiser un interface tu doit lui ajouter l'interface 'ISerializable' et implémenter la méthode 'GetObjectData(SerializationInfo, StreamingContext)'.
    https://msdn.microsoft.com/en-us/lib...ializable.aspx

    Bon après moi je ne connais pas trop les interfaces et la sérialisation.

    Bon courage

  5. #5
    Membre confirmé
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 134
    Par défaut
    Ok mais ce que je ne comprends pas c est pourquoi le classitemconfig seule ce serialise correctement tout comme la liste vide aussi. Par contre, dès que la liste contient des éléments ca plantes?

    J ai également essayé en supprimant l interface et en remplaçant la ilist par une simple list mais ca ne fonctionne pas mieux.

    Éventuellement une autre idée ou approche pour résoudre le problème?

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Utilisation d'une class abstraite et spécifier les extratypes dans XmlSerializer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
                Ctata Otata = new Ctata();
                Otata.Ototo.Add(new CItemConfig<int>() { Valeur = 5 });
                Otata.Ototo.Add(new CItemConfig<bool>() { Defaut = true });
                Sauve(Otata, System.IO.Path.Combine(Application.StartupPath, "ConfigFile.xml"));
     
            public void Sauve(Ctata obj, string fileName)
            {
                StreamWriter wr = null;
                try
                {
                    XmlSerializer xs = new XmlSerializer(obj.GetType() , new Type[] { typeof(CItemConfig<bool>), typeof(CItemConfig<int>) });
                    using (wr = new StreamWriter(fileName))
                    {
                        xs.Serialize(wr, obj);
                    }
                }
                catch (Exception e)
                {
                    System.Windows.Forms.MessageBox.Show(e.Message);
                }
            }
     
     
        public class Ctata
        {
            public List<CJob> Ototo = new List<CJob>();
        }
     
        public abstract class CJob
        {
        }
     
        [Serializable]
        public class CItemConfig<T> : CJob
        {
     
            public T Valeur
            {
                get;
                set;
            }
     
            [XmlAttribute]
            public T Defaut
            {
                get;
                set;
            }
        }
    Fichier généré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="utf-8"?>
    <Ctata xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <Ototo>
        <CJob xsi:type="CItemConfigOfInt32" Defaut="0">
          <Valeur>5</Valeur>
        </CJob>
        <CJob xsi:type="CItemConfigOfBoolean" Defaut="true">
          <Valeur>false</Valeur>
        </CJob>
      </Ototo>
    </Ctata>

Discussions similaires

  1. [WSAD5] probleme incompréhensible
    Par capitaine_banane dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 07/04/2004, 12h56
  2. [VB6]Sérialiser un objet
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 11/10/2003, 11h05
  3. Serialiser de gros documents XML
    Par philemon_siclone dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 17/09/2003, 16h26
  4. [JSP] Erreur incompréhensible
    Par xxaragornxx dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 09/09/2003, 17h37
  5. Sauvegarde problématique sous excel par OLE
    Par ulysse66x dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 16/04/2003, 22h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo