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

Serialisation Généique

Un petit exemple avec sérialisation générique applicable a tout modèle de classe
Avatar de kolodz
Modérateur https://www.developpez.com
Le 04/02/2016 à 14:38
L'ensemble du code proposé se base sur :
Code : Sélectionner tout
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));
Or, il y a des cas où ce morceau de code ne fonctionne pas (pas de constructeur sans argument ou non publique).
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.

A class that implements the interface must have a parameterless constructor. This is a requirement of the XmlSerializer class.
source: IXmlSerializable Interface
Avatar de charouel
Membre expérimenté https://www.developpez.com
Le 08/02/2016 à 14:03
Il faut juste avoir des objets Public !!!
Avatar de kolodz
Modérateur https://www.developpez.com
Le 08/02/2016 à 16:02
Non.Comme précédemment cité :
A class that implements the interface must have a parameterless constructor.
Avatar de charouel
Membre expérimenté https://www.developpez.com
Le 09/02/2016 à 11:34
Si tu teste l'exemple il n'y a pas des constructeurs !!
Avatar de kolodz
Modérateur https://www.developpez.com
Le 09/02/2016 à 13:41
Oui, sauf qu'une classe n'ayant pas de constructeur déclaré à par défaut le constructeur 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.
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.

Source : https://msdn.microsoft.com/en-us/lib...=vs.71%29.aspx
Avatar de charouel
Membre expérimenté https://www.developpez.com
Le 09/02/2016 à 13:46
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
Avatar de kolodz
Modérateur https://www.developpez.com
Le 09/02/2016 à 15:34
Donc, la solution n'est pas au sens strict générique.
Avatar de J@ckHerror
Membre expérimenté https://www.developpez.com
Le 09/02/2016 à 15:52
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.
Avatar de mermich
Membre expérimenté https://www.developpez.com
Le 26/04/2016 à 19:43
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
public static void Serialise<T>(T t,String filename) Where T : new()
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.