Bonjour,
Je vous propose un nouvel élément à utiliser : Serialisation Généique
Un petit exemple avec sérialisation générique applicable a tout modèle de classe
Qu'en pensez-vous ?
Bonjour,
Je vous propose un nouvel élément à utiliser : Serialisation Généique
Un petit exemple avec sérialisation générique applicable a tout modèle de classe
Qu'en pensez-vous ?
L'ensemble du code proposé se base sur :
Or, il y a des cas où ce morceau de code ne fonctionne pas (pas de constructeur sans argument ou non publique).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 //On crée une instance de XmlSerializer dans lequel on lui spécifie le type //de l'objet à sérialiser. On utiliser l'opérateur typeof pour cela. XmlSerializer serializer = new XmlSerializer(typeof(T));
Cette problématique a été vue ici : XmlSerializer : sérialiser mon propre objet
Cependant, il n'y a pas de FAQ parlant de la sérialisation en C# et de ces problématiques. Ce code peut-être ajouter avec les avertissement nécessaire.
source: IXmlSerializable InterfaceA class that implements the interface must have a parameterless constructor. This is a requirement of the XmlSerializer class.
Il faut juste avoir des objets Public !!!
Non.Comme précédemment cité :
A class that implements the interface must have a parameterless constructor.
Si tu teste l'exemple il n'y a pas des constructeurs !!
Oui, sauf qu'une classe n'ayant pas de constructeur déclaré à par défaut le constructeur sans paramètres :
Donc, oui ton code ne déclare pas de constructeur. Cependant, ton code nécessite bien un constructeur sans paramètres qui est fournit automatiquement dans ton cas. Il y aura une erreur, dans le cas où l'une des classes à sérialiser ou dé sérialiser déclare un constructeur avec paramètres et ne déclare pas de constructeurs sans paramètres.If a class contains no instance constructor declarations, a default instance constructor is automatically provided. That default constructor simply invokes the parameterless constructor of the direct base class. If the direct base class does not have an accessible parameterless instance constructor, a compile-time error occurs. If the class is abstract then the declared accessibility for the default constructor is protected. Otherwise, the declared accessibility for the default constructor is public.
Source : https://msdn.microsoft.com/en-us/lib...=vs.71%29.aspx
Oui c'est le constructeur par défaut, par contre ta raison si on déclare un constructeur avec paramètres il faut rajouter un constructeur sans paramètres
Donc, la solution n'est pas au sens strict générique.
Bonjour,
Oui il n'y a pas de constructeurs car ils sont implicites, dans le cas ou il n'y en a pas de précisé le compilateur crée un constructeur vide sans paramètre.
Mais rien n'empêche de créer un constructeur sans paramètre et de le définir comme private pour que justement il ne soit instanciable sans paramètre, c'est même plutot fréquent dans le monde de la POO je dirais.
Un véhicule a forcément un nombre de roue donc la classe véhicule sera instaciable uniquement à partir d'un entier supérieur à 0 par exemple, et on créera un constructeur privé, sans paramètre, dans lequel on initialisera les variables privée par exemple.
[EDIT] désolé j'ai 3 post de retard...
J@ck.
Salut,
Pendant que j'y pense, pour rendre le truc plus solide, on aurait put modifier les declaration des methodes, Serialise et DeSerialise pour mettre la contrainte de constructeur vide:
Code : Sélectionner tout - Visualiser dans une fenêtre à part public static void Serialise<T>(T t,String filename) Where T : new()
Il ne me semble pas que cela soit une syntaxe valable dans les anciennes versions.
Donc, ce n'était pas possible à l'époque.
Et aujourd'hui, ce n'est pas envisageable pour cause de rétrocompatibilité.
Dans tout les cas, cela ne change pas le problème de ces sources.
Cordialement,
Patrick Kolodziejczyk.
Partager