panglos499
Messages postés13Date d'inscriptionsamedi 14 juin 2008StatutMembreDernière intervention 7 juillet 2015
-
6 juil. 2015 à 20:27
panglos499
Messages postés13Date d'inscriptionsamedi 14 juin 2008StatutMembreDerniè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
cgandco
Messages postés219Date d'inscriptionmercredi 26 octobre 2011StatutMembreDernière intervention22 juin 20179 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.
cgandco
Messages postés219Date d'inscriptionmercredi 26 octobre 2011StatutMembreDernière intervention22 juin 20179 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)
{
....
}
}
Modifié par panglos499 le 7/07/2015 à 12:38
je n'avais ajouté
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 !