IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Serialisation XML erreur Reflexion


Sujet :

C#

  1. #1
    Membre du Club Avatar de Lelio1407
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Points : 68
    Points
    68
    Par défaut Serialisation XML erreur Reflexion
    Bonjour,

    Je voudrais sérialiser une classe "DBE_ProjectBase" mais j'obtiens l'erreur suivante
    "Une erreur s'est produite lors de la réflexion du type 'DBE_ProjectBase'.
    Voici la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public class DBE_ProjectBase
    {
            private String _dBE_Project_Name; 
            private Collection<DBE_ScreenBase> _dBE_Project_ScreensCollection;
     
             public DBE_ProjectBase()
            {
                _dBE_Project_Name = "";
               _dBE_Project_ScreensCollection = new Collection<DBE_ScreenBase>();
            }
     
            public String DBE_Project_Name { get; set; }
            public Collection<DBE_ScreenBase> DBE_Project_ScreensCollection { get; set; }
     
    }
    et la fonction de sérialisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void DBE_WriteProjectXAML(DBE_ProjectBase projectBase)
    {
         XmlSerializer xs = new XmlSerializer(typeof(DBE_ProjectBase));
         using (StreamWriter wr = new StreamWriter("project.xml"))
         {
             xs.Serialize(wr, projectBase);
          }
    }
    L'exeption se produit au moment du "new XmlSerializer(typeof(DBE_ProjectBase))";

    NB : la classe "DBE_ScreenBase" (champ et propriété Collection<DBE_ScreenBase>) est une classe public, non "static", qui contient un constructeur vide.

    Quelqu'un peut-il m'expliquer d'où vient le problème?

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Lelio1407 Voir le message
    NB : la classe "DBE_ScreenBase" (champ et propriété Collection<DBE_ScreenBase>) est une classe public, non "static", qui contient un constructeur vide.
    Et à part ce constructeur, elle contient quoi d'autre cette classe ?

    Par ailleurs, comme on a pas de boule de cristal, il faudrait plus de détail sur l'exception; entre autres :

    - type de l'exeption.
    - message
    - InnerException (type et message aussi, et si elle même a une InnerException, la même chose).

  3. #3
    Membre du Club Avatar de Lelio1407
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Points : 68
    Points
    68
    Par défaut
    Le message exact est :
    L'exception InvalidOperationException n'a pas été gérée. Une erreur s'est produite lors de la réflexion du type "DBE_ProjectBase".
    Concernant la classe "DBE_ScreenBase", voici sa structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class DBE_ScreenBase : INotifyPropertyChanged
    {
    private Collection<DBE_ScreenObjectBase> _dBE_Screen_ObjectsCollection;
     
    public DBE_ScreenBase()
    {
         _dBE_Screen_ObjectsCollection = new Collection<DBE_ScreenObjectBase>();
    }
     
    public Collection<DBE_ScreenObjectBase> DBE_Screen_ObjectsCollection {get; set;}
    }
    et où "DBE_ScreenObjectBase":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    public class DBE_ScreenObjectBase : UIElement, INotifyPropertyChanged
    {
    private DBE_ScreenObjectType_Enum       _dBE_ScreenObject_Type;
    private Int16                           _dBE_ScreenObject_PosX1;
    private Int16                           _dBE_ScreenObject_PosY1;
     
    public DBE_ScreenObjectBase()
    {
    _dBE_ScreenObject_Type = DBE_ScreenObjectType_Enum.TYPE_NULL;
    _dBE_ScreenObject_PosX1 = 0;
    _dBE_ScreenObject_PosY1 = 0;
    }
     
    public DBE_ScreenObjectType_Enum DBE_ScreenObject_Type { get; set; }
    public Int16 DBE_ScreenObject_PosX1  { get; set; }
    public Int16 DBE_ScreenObject_PosY1  { get; set; }
    }
    Merci pour ta réponse.

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Lelio1407 Voir le message
    Le message exact est :.
    Et il n'y a pas d'InnerException dans l'Exception ? ça m'étonne;

    Balance la serialisation en chaine complète de l'exception.

  5. #5
    Membre du Club Avatar de Lelio1407
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Points : 68
    Points
    68
    Par défaut
    Je ne comprends pas ta réponse :-(...
    Il n'y a pas d'InnerException...
    C'est exactement ce qu'il ya écrit dans la fenêtre d'erreur lorsque le programme plante...

  6. #6
    Membre du Club Avatar de Lelio1407
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Points : 68
    Points
    68
    Par défaut
    OK, en affichant "plus de détail, je trouve bien une InnerException...et en descendant, le problème viendrait de "DBE_ScreenObjectBase":
    Voici le détail...
    L'exception System.InvalidOperationException n'a pas été gérée
    Message=Une erreur s'est produite lors de la réflexion du type 'GraphConverter_DBE.DBE_ProjectBase'.
    Source=System.Xml
    StackTrace:
    à System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportElement(TypeModel model, XmlRootAttribute root, String defaultNamespace, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type, XmlRootAttribute root, String defaultNamespace)
    à System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace)
    à System.Xml.Serialization.XmlSerializer..ctor(Type type)
    à GraphConverter_DBE.DBE_Editor.DBE_Editor_WriteProjectXAML(DBE_ProjectBase dBE_Editor_CurrentProject) dans D:\Works SVN\Client\CLAIRITEC\GraphConverter_DBE\40-APPLICATIFS\Tronc\30-Source\GraphConverter3\GraphConverter_DBE\UserControls\DBE_Editor.xaml.cs:ligne 796
    à GraphConverter_DBE.DBE_Editor.DBE_ButtonSave_Click(Object sender, RoutedEventArgs e) dans D:\Works SVN\Client\CLAIRITEC\GraphConverter_DBE\40-APPLICATIFS\Tronc\30-Source\GraphConverter3\GraphConverter_DBE\UserControls\DBE_Editor.xaml.cs:ligne 768
    à System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
    à System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
    à System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
    à System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
    à GraphConverter_DBE.DBE_ButtonSave.DBE_Button_Save_Click(Object sender, RoutedEventArgs e) dans D:\Works SVN\Client\CLAIRITEC\GraphConverter_DBE\40-APPLICATIFS\Tronc\30-Source\GraphConverter3\GraphConverter_DBE\UserControls\DBE_ButtonSave.xaml.cs:ligne 40
    à System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
    à System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
    à System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
    à System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
    à System.Windows.Controls.Primitives.ButtonBase.OnClick()
    à System.Windows.Controls.Button.OnClick()
    à System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
    à System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)
    à System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
    à System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
    à System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
    à System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
    à System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
    à System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)
    à System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
    à System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
    à System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
    à System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
    à System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
    à System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
    à System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
    à System.Windows.Input.InputManager.ProcessStagingArea()
    à System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
    à System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
    à System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
    à System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
    à System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
    à MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
    à MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
    à System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
    à MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
    à System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
    à MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
    à MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
    à System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
    à System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
    à System.Windows.Application.RunDispatcher(Object ignore)
    à System.Windows.Application.RunInternal(Window window)
    à System.Windows.Application.Run(Window window)
    à System.Windows.Application.Run()
    à GraphConverter2.GC_App.Main() dans D:\Works SVN\Client\CLAIRITEC\GraphConverter_DBE\40-APPLICATIFS\Tronc\30-Source\GraphConverter3\GraphConverter2\obj\x86\Debug\GC_App.g.cs:ligne 0
    à System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
    à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
    à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    à System.Threading.ThreadHelper.ThreadStart()
    InnerException: System.InvalidOperationException
    Message=Une erreur s'est produite lors de la réflexion de la propriété 'DBE_Project_ScreensCollection'.
    Source=System.Xml
    StackTrace:
    à System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter)
    InnerException: System.InvalidOperationException
    Message=Une erreur s'est produite lors de la réflexion du type 'GraphConverter_DBE.DBE_ScreenBase'.
    Source=System.Xml
    StackTrace:
    à System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.CreateArrayElementsFromAttributes(ArrayMapping arrayMapping, XmlArrayItemAttributes attributes, Type arrayElementType, String arrayElementNs, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportArrayLikeMapping(ArrayModel model, String ns, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportAccessorMapping(MemberMapping accessor, FieldModel model, XmlAttributes a, String ns, Type choiceIdentifierType, Boolean rpc, Boolean openModel, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportFieldMapping(StructModel parent, FieldModel model, XmlAttributes a, String ns, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter)
    InnerException: System.InvalidOperationException
    Message=Une erreur s'est produite lors de la réflexion de la propriété 'DBE_Screen_ObjectsCollection'.
    Source=System.Xml
    StackTrace:
    à System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter)
    InnerException: System.InvalidOperationException
    Message=Une erreur s'est produite lors de la réflexion du type 'GraphConverter_DBE.DBE_ScreenObjectBase'.
    Source=System.Xml
    StackTrace:
    à System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.CreateArrayElementsFromAttributes(ArrayMapping arrayMapping, XmlArrayItemAttributes attributes, Type arrayElementType, String arrayElementNs, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportArrayLikeMapping(ArrayModel model, String ns, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportAccessorMapping(MemberMapping accessor, FieldModel model, XmlAttributes a, String ns, Type choiceIdentifierType, Boolean rpc, Boolean openModel, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportFieldMapping(StructModel parent, FieldModel model, XmlAttributes a, String ns, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter)
    InnerException: System.InvalidOperationException
    Message=Une erreur s'est produite lors de la réflexion de la propriété 'InputBindings'.
    Source=System.Xml
    StackTrace:
    à System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter)
    InnerException: System.InvalidOperationException
    Message=Une erreur s'est produite lors de la réflexion du type 'System.Windows.Input.InputBinding'.
    Source=System.Xml
    StackTrace:
    à System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.CreateArrayElementsFromAttributes(ArrayMapping arrayMapping, XmlArrayItemAttributes attributes, Type arrayElementType, String arrayElementNs, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportArrayLikeMapping(ArrayModel model, String ns, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportAccessorMapping(MemberMapping accessor, FieldModel model, XmlAttributes a, String ns, Type choiceIdentifierType, Boolean rpc, Boolean openModel, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportFieldMapping(StructModel parent, FieldModel model, XmlAttributes a, String ns, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter)
    InnerException: System.InvalidOperationException
    Message=Impossible de sérialiser le membre 'System.Windows.Input.InputBinding.Command' de type 'System.Windows.Input.ICommand'. Pour plus de détails, consultez l'exception interne.
    Source=System.Xml
    StackTrace:
    à System.Xml.Serialization.StructModel.CheckSupportedMember(TypeDesc typeDesc, MemberInfo member, Type type)
    à System.Xml.Serialization.StructModel.GetPropertyModel(PropertyInfo propertyInfo)
    à System.Xml.Serialization.StructModel.GetFieldModel(MemberInfo memberInfo)
    à System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter limiter)
    à System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter)
    InnerException: System.NotSupportedException
    Message=Impossible de sérialiser le membre System.Windows.Input.InputBinding.Command de type System.Windows.Input.ICommand car il s'agit d'une interface.
    InnerException:

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Et on a donc la cause, claire et sans ambigüité :

    InnerException: System.NotSupportedException
    Message=Impossible de sérialiser le membre System.Windows.Input.InputBinding.Command de type System.Windows.Input.ICommand car il s'agit d'une interface.
    Bref, tu tentes de persister des éléments relevant de l'interface utilisateur en l'occurence un binding, décrits visiblement dans :

    UIElement

    Et ça, c'est comme persister une connexion, ça ne peut pas marcher : ce sont des objets non sérialisables.

  8. #8
    Membre du Club Avatar de Lelio1407
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Points : 68
    Points
    68
    Par défaut
    OK, je crois comprendre...
    Les classes "DBE_ScreenBase" et "DBE_ScreenObjectBase" héritent de "INotifyPropertyChanged" qui est une Interface. Hors, il me semble avoir lu que les Interfaces ne sont pas sérialisables. D'où le plantage!

  9. #9
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Lelio1407 Voir le message
    OK, je crois comprendre...
    Les classes "DBE_ScreenBase" et "DBE_ScreenObjectBase" héritent de "INotifyPropertyChanged" qui est une Interface. Hors, il me semble avoir lu que les Interfaces ne sont pas sérialisables. D'où le plantage!
    Et on ne sait pas ce qu'il y a dans UIElement. (on ne sait pas si il est persistable).

  10. #10
    Membre du Club Avatar de Lelio1407
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Points : 68
    Points
    68
    Par défaut
    OK, l'héritage de UIElement n'était plus obligatoire, je peux m'en passer.
    En revanche, INotify, je ne peux pas.

    Dans ce cas, existe-t-il un moyen (comme dans la serialisation binaire avec l'attribut [NonSerialized]) d'indiquer au serializer d'ignorer le "public event PropertyChangedEventHandler PropertyChanged" de DBE_ScreenBase et DBE_ScreenObjectBase si c'est ça qui fait planter?

    Sinon, tant pis, j'irai sauvegarder mes données à la main avec un bon vieux streamwriter...

    Et merci pour ton aide...

  11. #11
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Lelio1407 Voir le message
    OK, l'héritage de UIElement n'était plus obligatoire, je peux m'en passer.
    En revanche, INotify, je ne peux pas.

    Dans ce cas, existe-t-il un moyen (comme dans la serialisation binaire avec l'attribut [NonSerialized]) d'indiquer au serializer d'ignorer le "public event PropertyChangedEventHandler PropertyChanged" de DBE_ScreenBase et DBE_ScreenObjectBase si c'est ça qui fait planter?.
    Attribut [XmlIgnore]

  12. #12
    Membre du Club Avatar de Lelio1407
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Points : 68
    Points
    68
    Par défaut
    Malheureusement, si je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [XmlIgnore]
    public event PropertyChangedEventHandler PropertyChanged;
    le compilateur me dit :

    L'attribut 'XmlIgnore' n'est pas valide dans ce type de déclaration. Il n'est valide que dans les déclarations 'property, indexer, field, param, return'

  13. #13
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Lelio1407 Voir le message
    Malheureusement, si je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [XmlIgnore]
    public event PropertyChangedEventHandler PropertyChanged;
    le compilateur me dit :
    J'ai répondu trop vite, désolé.

    Sur un event ce n'est pas nécessaire car il est ignoré par la sérialisation Xml de toute manière.

    Le mieux est de partir du fonctionnement de cette sériaisation : contrairement à la sérialsiation binaire elle examine juste les variables membres"public" (je suppose que tu n'en as pas .... car il n'y a pas de raison d'en avoir) et les propriétés "public" disposant d'un get et d'un set.

    Et il ne sérialise que ces valeurs.

    Donc passe en revue l'ensemble des propriétés publiques exposées par ta classe et regarde celle qui sème la zone; sur celle là tu mets un XmlIgnore.

  14. #14
    Membre du Club Avatar de Lelio1407
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Points : 68
    Points
    68
    Par défaut
    Bien, ça avance petit à petit...
    Il semblerait que l'héritage du UIElement était ce qui provoquait la première exception. Ceci dit, je continue à ne pas pouvoir sérialiser mon "DBE_ProjectBase".
    Voici le problème :
    la classe "DBE_ProjectBase" possède un champ private et sa propriété public associée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private Collection<DBE_ScreenBase> _dBE_Project_ScreensCollection;
    public Collection<DBE_ScreenBase> DBE_Project_ScreensCollection { get; set; }
    De même, la classe "DBE_ScreenBase" possède un champ private et sa propriété public :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private Collection<DBE_ScreenObjectBase> _dBE_Screen_ObjectsCollection;
    public Collection<DBE_ScreenObjectBase> DBE_Screen_ObjectsCollection { get; set; }
    Dans ma Collection de "DBE_ScreenObjectBase", les "DBE_ScreenObjectBase" peuvent être des "DBE_ScreenObjectFont" ou des "DBE_ScreenObjectPicture" où :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public class DBE_ScreenObjectFont : DBE_ScreenObjectBase
    {
    /..../
    }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public class DBE_ScreenObjectPicture : DBE_ScreenObjectBase
    {
    /..../
    }
    L'erreur que j'ai maintant est la suivante :
    InvalidOperationExceoption : Erreur lors de la génération du document XML
    avec InnerException :
    Le type DBE_ScreenObjectFont (ou DBE_ScreenObjectPicture selon l'objet présent dans ma collection) n'était pas attendu. Utilisez l'attribut XmlInclude ou SoapInclude pour spécifier les types qui ne sont pas connus statiquement.
    J'ai bien rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    [XmlInclude(typeof(DBE_ScreenObjectPicture))]
    public class DBE_ScreenObjectPicture : DBE_ScreenObjectBase
    {
    /.../
    }
    et ce, sur toute les classes qui sont sensées être appelées par le serializer mais l'erreur persiste...

    Est-ce la bonne utilisation de l'attribut XmlInclude?

Discussions similaires

  1. Erreur serialisation XML
    Par adosteam dans le forum C#
    Réponses: 4
    Dernier message: 19/04/2013, 15h51
  2. [servlet][xml] Erreur de parsing
    Par james2001 dans le forum Servlets/JSP
    Réponses: 26
    Dernier message: 03/11/2005, 07h08
  3. [XSL] Parser fichier xml : erreurs + incompréhensions
    Par totobouchon dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 19/07/2005, 15h47
  4. [DOM] [Package] serialisation XML
    Par Overflow64 dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 19/10/2004, 16h43
  5. [Concept][Sérialisation] XML ou serializable
    Par christopheJ dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 03/06/2004, 13h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo