2015-07-06 6 views
-1

сериализовать объекты родительского класса и производных от нееПочему объект, правильно построенный с помощью метода десериализации, имеет тест отказов Myclass? или как MyClass?

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


} 

, когда déssérialisation из ArrayList как тип объекта является правильным, тест не работает.

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

} 

Невозможно для меня назначить объекты из объекта на объект родительского класса.

elmt1 = (XmlInfo)elmt; 

System.InvalidCastException исключение было необработанным с помощью кода пользователя Message = [A] CyXml.XmlInfo не может быть преобразован в [B] CyXml.XmlInfo. Тип A поступает из «IHMTest, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null» в контексте «По умолчанию» в месте «C: \ TwinCAT \ TcApplication \ Plugins \ IHMTest.dll». Тип B относится к «IHMTest, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null» в контексте «LoadFrom» в месте «C: \ TwinCAT \ Plugins \ IHMTest.dll». Источник = IHMTest

этот код корректно работает в программе, но не работает в библиотеке DLL

кого-то есть идеи?

сердечного привет

+0

'n'a pas été gérée par le code utilisateur' bla bla bla. Вы можете, по крайней мере, использовать перевод Google для публикации сообщения об ошибке на английском языке. – EZI

+0

Я редактировал ваше исключение на английском языке, чтобы оно было читаемым. Ваш заголовок также может быть лучше написан, например: «Объект XmlSerializer.Serialize не будет десериализоваться обратно к исходному типу объекта» –

ответ

-1

Вы пытаетесь преобразовать реализацию XmlInfo объявленной в одной DLL к экземпляру реализации разных из XmlInfo, объявленной в другой DLL.

Без a good, minimal, complete code example, который надежно воспроизводит проблему, невозможно сказать, что лучший способ исправить это. Но очень вероятно, что вы по какой-то причине скопировали/вставляли реализацию из одной DLL в другую, возможно, посредством собственно компиляции того же файла .cs в обеих DLL, в результате чего объявлялись два разных типа.

В общем, правильный способ исправить это будет только объявлять тип в одном месте и иметь весь код, который зависит от типа ссылки DLL, где объявлено.

+0

Скрывая имя каталога, содержащего личную и личную информацию, я вижу, что вас было два dll, то же самое в моем проекте (копия пост-сборки). на самом деле это является причиной моих проблем! Большое спасибо – panglos499

Смежные вопросы