Déssérialisation ArrayList

Résolu
panglos499 Messages postés 13 Date d'inscription samedi 14 juin 2008 Statut Membre Dernière intervention 7 juillet 2015 - 6 juil. 2015 à 20:27
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

2 réponses

cgandco Messages postés 219 Date d'inscription mercredi 26 octobre 2011 Statut Membre Dernière intervention 22 juin 2017 9
7 juil. 2015 à 11:29
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
1
panglos499 Messages postés 13 Date d'inscription samedi 14 juin 2008 Statut Membre Dernière intervention 7 juillet 2015
Modifié par panglos499 le 7/07/2015 à 12:38
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 !
0
cgandco Messages postés 219 Date d'inscription mercredi 26 octobre 2011 Statut Membre Dernière intervention 22 juin 2017 9
7 juil. 2015 à 11:16
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
0
Rejoignez-nous