web-dev-qa-db-fra.com

Qu'est-ce que cela signifie: La classe sérialisable ne déclare pas un champ final serialVersionUID statique.

J'ai le message d'avertissement donné dans le titre. Je voudrais comprendre et l'enlever. J'ai déjà trouvé quelques réponses à cette question mais je ne les comprends pas à cause d'une surcharge de termes techniques. Est-il possible d'expliquer ce problème avec des mots simples?

P.S. Je sais ce que OOP est. Je sais ce que sont objet, classe, méthode, champ et instanciation.

P.P.S. Si quelqu'un a besoin de mon code, c'est ici:

import Java.awt.*;
import javax.swing.*;


public class HelloWorldSwing extends JFrame {

        JTextArea m_resultArea = new JTextArea(6, 30);

        //====================================================== constructor
        public HelloWorldSwing() {
            //... Set initial text, scrolling, and border.
            m_resultArea.setText("Enter more text to see scrollbars");
            JScrollPane scrollingArea = new JScrollPane(m_resultArea);
            scrollingArea.setBorder(BorderFactory.createEmptyBorder(10,5,10,5));

            // Get the content pane, set layout, add to center
            Container content = this.getContentPane();
            content.setLayout(new BorderLayout());
            content.add(scrollingArea, BorderLayout.CENTER);
            this.pack();
        }

        public static void createAndViewJFrame() {
            JFrame win = new HelloWorldSwing();
            win.setTitle("TextAreaDemo");
            win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            win.setVisible(true);
        }

        //============================================================= main
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable(){
                public void run(){
                    createAndViewJFrame();
                }
            });
        }

}
203
Roman

De la javadoc :

L'exécution de la sérialisation associe à chaque classe sérialisable un numéro de version, appelé serialVersionUID, utilisé lors de la désérialisation pour vérifier que l'expéditeur et le destinataire d'un objet sérialisé ont chargé pour cet objet des classes compatibles avec la sérialisation. Si le destinataire a chargé une classe pour l'objet ayant une serialVersionUID différente de celle de la classe de l'expéditeur correspondante, la désérialisation aboutit à un InvalidClassException. Une classe sérialisable peut déclarer sa propre serialVersionUID explicitement en déclarant un champ nommé "serialVersionUID" qui doit être statique, final et de type long:

Vous pouvez configurer votre IDE pour:

  • ignorer ceci, au lieu de donner un avertissement.
  • générer automatiquement un identifiant

Selon votre question supplémentaire "Peut-il être que le message d'avertissement discuté est une raison pour laquelle mon application d'interface graphique se fige?":

Non, ça ne peut pas être. Cela peut poser un problème uniquement si vous sérialisez des objets et que vous les désérialisez à un autre endroit (ou à une autre heure) où (quand) la classe a changé et cela n'entraînera pas un gel, mais InvalidClassException.

149
Bozho

Les raisons de l'avertissement sont documentées ici , et les solutions simples consistent à désactiver l'avertissement ou à insérer la déclaration suivante dans votre code pour fournir la version UID. La valeur réelle n'est pas pertinente, commencez par 999 si vous le souhaitez, mais modifiez-la lorsque vous apportez des modifications incompatibles à la classe.

public class HelloWorldSwing extends JFrame {

        JTextArea m_resultArea = new JTextArea(6, 30);
        private static final long serialVersionUID = 1L;
33
Robin

Les autres réponses à ce jour ont beaucoup d'informations techniques. Je vais essayer de répondre, comme demandé, en termes simples.

La sérialisation est ce que vous faites à une instance d'un objet si vous souhaitez le vider dans une mémoire tampon brute, l'enregistrer sur un disque, le transporter dans un flux binaire (par exemple, envoyer un objet sur une socket réseau), ou créer un fichier sérialisé. représentation binaire d'un objet. (Pour plus d'informations sur la sérialisation, voir Sérialisation Java sur Wikipedia ).

Si vous n'avez pas l'intention de sérialiser votre classe, vous pouvez ajouter l'annotation juste au-dessus de votre classe @SuppressWarnings("serial").

Si vous souhaitez sérialiser, vous devez vous inquiéter de toutes les choses qui sont centrées sur l'utilisation correcte de l'UUID. Fondamentalement, l'UUID est un moyen de "version" d'un objet à sérialiser de sorte que le processus en cours de désérialisation sache qu'il est correctement désérialisé. Je voudrais regarder Assurer un contrôle de version approprié pour les objets sérialisés pour plus d'informations.

32
MrMas

il doit être changé chaque fois que quelque chose change qui affecte la sérialisation (champs supplémentaires, champs supprimés, changement d'ordre des champs, ...)

Ce n'est pas correct et vous ne pourrez pas citer une source faisant autorité pour cette affirmation. Il doit être changé chaque fois que vous apportez une modification incompatible avec les règles données dans la section Versioning des objets sérialisables de la Spécification de la sérialisation des objets , qui fait spécifiquement pas inclure des champs supplémentaires ou un changement d'ordre des champs, et lorsque vous n'avez pas fourni readObject(), writeObject(), et/ou readResolve() ou /writeReplace() méthodes et/ou une déclaration serializableFields pouvant supporter le changement.

27
user207421

Toute classe pouvant être sérialisée (c'est-à-dire implémente Serializable) doit déclarer cet UID et doit être modifié chaque fois que des modifications affectent la sérialisation (champs supplémentaires, champs supprimés, changement d'ordre des champs, ...). La valeur du champ est vérifiée lors de la désérialisation et si la valeur de l'objet sérialisé n'est pas égale à la valeur de la classe dans la VM actuelle, une exception est levée.

Notez que cette valeur est particulière en ce sens qu'elle est sérialisée avec l'objet même s'il est statique, pour les raisons décrites ci-dessus.

5
Thomas Lötzer