Déssérialisation ArrayList [Résolu]

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

3 réponses

Répondre au sujet
cgandco 219 Messages postés mercredi 26 octobre 2011Date d'inscription 22 juin 2017 Dernière intervention - 7 juil. 2015 à 11:29
+1
Utile
1
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
Cette réponse vous a-t-elle aidé ?  
panglos499 13 Messages postés samedi 14 juin 2008Date d'inscription 7 juillet 2015 Dernière intervention - 7 juil. 2015 à 12:37
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
cgandco 219 Messages postés mercredi 26 octobre 2011Date d'inscription 22 juin 2017 Dernière intervention - 7 juil. 2015 à 11:16
0
Utile
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.