Déssérialisation ArrayList [Résolu]

Messages postés
13
Date d'inscription
samedi 14 juin 2008
Statut
Membre
Dernière intervention
7 juillet 2015
- - Dernière réponse : panglos499
Messages postés
13
Date d'inscription
samedi 14 juin 2008
Statut
Membre
Dernière intervention
7 juillet 2015
- 7 juil. 2015 à 12:37
Bonjour,
je sérialise des objets d'une classe mère ainsi que que d'autre de classe dérivées de celle-ci

namespace CyXml
{
[Serializable]
public class XmlInfo : IFormattable, ISerializable
{
public string Mnemonique { get; set; }
....
}
[Serializable]
public class XmlLabel: XmlInfo
{
public XmlLabel()
: base()
{
}
....
}
[Serializable]
public class XmlVoyant : XmlInfo
{
public XmlVoyant()
: base()
{
}
....
}
[Serializable]
public class XmlButton: XmlInfo
{
public XmlButton()
: base()
{
}
....
}


}



lors de la déssérialisation d'une ArrayList alors que le Type de l'objet est correct le test is ne fonctionne pas .


ArrayList XmlInfos = new ArrayList ();
public void ReadXmllInfo(int vue)
{
System.Xml.Serialization.XmlSerializer reader =
new System.Xml.Serialization.XmlSerializer(typeof(ArrayList),
new Type[]{
typeof(CyXml.XmlInfo),
typeof(CyXml.XmlLabel),
typeof(CyXml.XmlVoyant),
typeof(CyXml.XmlButton)});

string xml = String.Format(@"C:\XML\Outil{0}.xml", vue);
System.IO.StreamReader file = null;
try
{
file = new System.IO.StreamReader(xml);

XmlInfos = (ArrayList)reader.Deserialize(file);

}
catch (Exception exception)
{
MessageBox.Show(exception.Message);
}
finally
{
if (file != null)
file.Close();
}
int TabIndex=this.Controls.Count;

foreach(var elmt in XmlInfos)
{
//MessageBox.Show(elmt.GetType().ToString());
Type serie=elmt.GetType();
XmlInfo elmt1 = new XmlInfo();
Type serie1 = elmt1.GetType();
elmt1 = (XmlInfo)elmt;

if (elmt is XmlInfo )
{
....
}
else if (elmt is XmlLabel)
{
....
}
else if (elmt is XmlVoyant)
{
....
}
else if (elmt is XmlButton)
{
....
}
}

}






il m'est impossible de même d'affecter les objets issus de la déssérialisation à un objet de la classe mère

elmt1 = (XmlInfo)elmt;


cela provoque "L'exception System.InvalidCastException n'a pas été gérée par le code utilisateur
Message=[A]CyXml.XmlInfo ne peut pas être converti en [B]CyXml.XmlInfo. Le type A provient de 'IHMTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' dans le contexte 'Default' à l'emplacement 'C:\TwinCAT\TcApplication\Plugins\IHMTest.dll'. Le type B provient de 'IHMTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' dans le contexte 'LoadFrom' à l'emplacement 'C:\TwinCAT\Clemessy\Plugins\IHMTest.dll'.
Source=IHMTest"



ce code fonctionne correctement dans un programme mais ne fonctionne pas dans une dll


quelqu'un a une idée ?


Cordialement
Afficher la suite 

2 réponses

Meilleure réponse
Messages postés
219
Date d'inscription
mercredi 26 octobre 2011
Statut
Membre
Dernière intervention
22 juin 2017
8
1
Merci
Rebonjour,

non ce nest pas cela, enfin presque

tu as mis une réference vers ta dll et en plus tu as lié ta dll avec de la reflexion.

cela provoque "L'exception System.InvalidCastException n'a pas été gérée par le code utilisateur
Message=[A]CyXml.XmlInfo ne peut pas être converti en [B]CyXml.XmlInfo. Le type A provient de 'IHMTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' dans le contexte 'Default' à l'emplacement 'C:\TwinCAT\TcApplication\Plugins\IHMTest.dll'. Le type B provient de 'IHMTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' dans le contexte 'LoadFrom' à l'emplacement 'C:\TwinCAT\Clemessy\Plugins\IHMTest.dll'.
Source=IHMTest"

les deux classes sont donc bien différentes.

car la dll n'est pas la même.

le plus simple est d'employer soit la réference soit la reflexion.


bonne journée

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 202 internautes nous ont dit merci ce mois-ci

panglos499
Messages postés
13
Date d'inscription
samedi 14 juin 2008
Statut
Membre
Dernière intervention
7 juillet 2015
-
c'est bien ça le problème ! deux dll identiques dans mon projet !!

je n'avais ajouté
elmt1 = (XmlInfo)elmt
que pour illustrer que le is ne fonctionnait pas car le type n'était pas identique pour le systeme sans que je comprenne pourquoi.

je n'avais pas fait attention aux chemins indiqués par l'exception


Merci !
Commenter la réponse de cgandco
Messages postés
219
Date d'inscription
mercredi 26 octobre 2011
Statut
Membre
Dernière intervention
22 juin 2017
8
0
Merci
Bonjour,

Lors de la désérialisation, c'est le type

typeof(CyXml.XmlInfo)


et ensuite c'est

elmt1 = (XmlInfo)elmt;


As tu mis une réference vers CyXml (ta dll) ?

si non la définition de XmlInfo n'exite t'elle pas encore dans ton exe ?

ce qui fait que tu veux caster un CyXml.XMLInfo en XMLInfo qui sont des classes différentes.

pour tester place un CyXml. devant chaque casting et is

foreach(var elmt in XmlInfos)
            {
                //MessageBox.Show(elmt.GetType().ToString());
                Type serie=elmt.GetType();
                CyXml.XmlInfo elmt1 = new CyXml.XmlInfo();
                Type serie1 = elmt1.GetType();
                elmt1 = (CyXml.XmlInfo)elmt;
 
                if (elmt is CyXml.XmlInfo )
                {
                ....
                }
                else if (elmt is CyXml.XmlLabel)
                {
                ....
                }
                else if (elmt is CyXml.XmlVoyant)
                {
                ....
                }
                else if (elmt is CyXml.XmlButton)
                {
                ....
                }
            }


Bonne journée
Commenter la réponse de cgandco