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 :

Deep copy non serializable


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 66
    Par défaut Deep copy non serializable
    Bonjour,

    Je souhaite effectuer une deepcopy d'une classe qui n'est pas défini par mes soins (Viewport3D : https://msdn.microsoft.com/fr-fr/lib...vs.110%29.aspx). En retournant l'interdent mondial j'ai trouvé quelques solutions ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    IFormatter formatter = new BinaryFormatter();
    Stream stream = new MemoryStream();
    using (stream)
    {
       formatter.Serialize(stream, source);
       stream.Seek(0, SeekOrigin.Begin);
       return (T)formatter.Deserialize(stream);
    }
    Le problème est que cette classe n'est pas serializable donc la solution n'est pas utilisable. Du coup comment puis-je faire ? A priori je ne peux pas "rendre une classe serializable"car si elle ne l'est pas c'est que certaines variables ne peuvent pas être stocker en tant que texte ?
    De ce que j'ai lu je pourrais ajouter une "etension" à la classe pour y mettre une méthode qui copierait les items un a un.. Y a t-il une meilleure solution ?

    Merci d'avance !

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 123
    Par défaut
    Bonjour,

    Ceci devrait fonctionner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    XmlSerializer xs = new XmlSerializer(typeof(Viewport3D));
        using (StreamWriter wr = new StreamWriter("Viewport3D.xml"))
        {
            xs.Serialize(wr, viewport);
        }

  3. #3
    Membre très actif
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 618
    Billets dans le blog
    9
    Par défaut
    Façons typiques de copier un type référencé:

    utilisation constructeur de copie
    méthode de fabrique de l'utilisation (par exemple. types immuables)
    utiliser votre propre "Clone"
    copier seule référence (par ex. autres Root-Type)
    créer une nouvelle instance et copier les propriétés (par ex. les types ne sont pas rédigés par vous-même dépourvus d'un constructeur de copie)

    Code C# : 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
    19
    20
    21
    22
    23
    24
    25
    class A
    {
      // copy constructor
      public A(A copy) {}
    }
     
    // a referenced class implementing 
    class B : IDeepCopy
    {
      object Copy() { return new B(); }
    }
     
    class C : IDeepCopy
    {
      A A;
      B B;
      object Copy()
      {
        C copy = new C();
     
        // copy property by property in a appropriate way
        copy.A = new A(this.A);
        copy.B = this.B.Copy();
      }
    }

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 66
    Par défaut
    @mattdef J'ai du mal a comprendre comment je dois l'utiliser au niveau de la serialization/copie

    @charouel la classe n'est pas écrite par moi du coup je ne peux pas mettre en place cette solution non ?


    Merci de votre aide !

  5. #5
    Membre très actif
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 618
    Billets dans le blog
    9
    Par défaut
    Tu fait une classe qui hérité de la classe que tu n'a pas fait => puis tu rajoute le constructeur de copie

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 66
    Par défaut
    Aaaaah exact ! Merci Charouel, je vais essayer ça !

    Edit : J'essaye d'utiliser GetProperties ( ex : destinationProperties = destination.GetType().GetProperties(); ) afin d'automatiser la copie des attributs car il y en a quand même pas mal mais ce n'est pas très concluent.. Un conseil à ce sujet ?

Discussions similaires

  1. Copie non systématique de ressources
    Par coren dans le forum Maven
    Réponses: 1
    Dernier message: 22/04/2009, 15h59
  2. problème Non-serializable object
    Par laurent.c123 dans le forum Langage
    Réponses: 2
    Dernier message: 02/10/2008, 13h36
  3. Création d'une copie non voulu de la base à la fermeture
    Par ricou69 dans le forum Modélisation
    Réponses: 10
    Dernier message: 22/10/2007, 08h43
  4. Réponses: 9
    Dernier message: 02/10/2007, 16h12
  5. [VBA-E] Sauvegarder une copie non protégée lors de la sauvegarde
    Par thomasvst dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/03/2007, 14h01

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