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

API standards et tierces Java Discussion :

Supprimer le Collator d'un TreeMap avant Sérialisation


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut Supprimer le Collator d'un TreeMap avant Sérialisation
    Salut,
    je bute sur un problème depuis quelques temps, peut-être que quelqu'un aura la réponse ?
    J'initialise un TreeMap dans une classe Test implémentant Serializable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.items = new TreeMap(Collator.getInstance(Locale.FRENCH));
    RuledBaseCollator n'implémente pas Serializable donc je ne peux pas sérialiser la classe Test (NotSerializableException). J'étend donc RuleBasedCollator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class TestRuleBasedCollatorextends RuleBasedCollator implements Serializable {
     
        public TestRuleBasedCollator() throws Exception {
     super(((RuleBasedCollator)Collator.getInstance(Locale.FRENCH)).getRules());
        }
    Cette fois la sérialisation marche mais la lecture du fichier plante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.io.InvalidClassException: TestRuleBasedCollator; no valid constructor
    Apparemment il n'y a pas moyen de supprimer le Collator d'un TreeMap.
    Il n'y a pas non plus de fonction pour trier un TreeMap en utilisant un Collator. Pensez-vous que les seules solutions sont de créer une fonction qui triera le TreeMap ou alors de créer un nouveau TreeMap avant la sérialisation ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     this.items = new TreeMap(this.items);
    Merci d'avance.
    Bye ^^

  2. #2
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Petite solution :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    // Classe encapsulante pour le collator
    public class Capsule implements Comparator<String> {
     
     // Eventuellement le collator en champs transient (non enregistré)
     private transient Collator collator;
     
     // Constructeur
     public Capsule() {
       // Chargement du collator
       this.collator = Collator.getInstance(Locale.FRENCH);
     }
     
     // Comparaison
     public int compare(String o1, String o2) {
     
       return this.collator.compare(o1, o2);
     
     }
     
      // Sauvegarde de la capsule
      private void writeObject(ObjectOutputStream s) throws IOException {
           s.defaultWriteObject();
           // on ne fait rien
        }
     
      // Chargement de la capsule
      private void readObject(ObjectInputStream s) 
          throws OptionalDataException, ClassNotFoundException, IOException  {
           s.defaultReadObject();
     
           /* Récupération du colator */
           this.collator = ( new Capsule() ).collator;
     
        } 
     
    } // Capsule
    J'utilise cette technique qui marche très bien avec un singleton sur Capsule Et ca évite d'avoir des trucs moche comme : "new Capsule().collator;
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  3. #3
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Salut et merci beaucoup pour ta méthode
    Finalement j'ai fait autrement et je n'utilise plus de Collator avec le TreeMap mais je garde ceci dans un coin. ^^
    Bye

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/11/2012, 13h39
  2. Vider un JTextPane avant de le sérialiser
    Par Djakisback dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 24/05/2006, 11h57
  3. Supprimer espace avant insertion dans état
    Par aCe_GiK dans le forum Access
    Réponses: 5
    Dernier message: 24/04/2006, 17h34
  4. Réponses: 4
    Dernier message: 04/04/2006, 16h09
  5. [Sécurité] Confirmation avant de supprimer
    Par borgfabr dans le forum Langage
    Réponses: 20
    Dernier message: 12/12/2005, 18h02

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