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
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.
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)
{
....
}
}
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 !