Qu'est-ce que cela signifie: La classe sérialisable ne déclare pas un champ serialVersionUID static final? [dupliquer]

StackOverflow https://stackoverflow.com/questions/2288937

Question

    

Cette question a déjà une réponse ici:

         

Je le message d'avertissement donné dans le titre. Je voudrais comprendre et le retirer. J'ai trouvé déjà quelques réponses sur cette question, mais je ne comprends pas ces réponses en raison d'une surcharge avec des 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 qui est objet, classe, méthode, champ et instanciation.

P.P.S. Si quelqu'un a besoin de mon code, il 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();
                }
            });
        }

}
Était-ce utile?

La solution

De la javadoc :

  

Les associés d'exécution de sérialisation avec chaque classe sérialisable un numéro de version, appelée serialVersionUID, qui est utilisé lors de la désérialisation pour vérifier que l'expéditeur et le destinataire d'un objet sérialisé ont les classes chargées pour cet objet qui sont compatibles avec le respect de la sérialisation. Si le récepteur a chargé une classe pour l'objet qui a un autre serialVersionUID que celle de la classe de l'expéditeur correspondant, puis désérialisation se traduira par une InvalidClassException. Une classe sérialisable peut déclarer sa propre serialVersionUID explicitement en déclarant un champ "serialVersionUID" nommé qui doit être statique, finale et de type long:

Vous pouvez configurer votre IDE:

  • ignorer, au lieu de donner un avertissement.
  • autogenerate un id

Selon votre autre question « peut-il que le message d'avertissement est discuté une raison pour laquelle geler mon application GUI? »:

Non, il ne peut pas être. Elle peut causer seulement un problème si vous êtes des objets sérialisation et les désérialisation dans un endroit différent (ou le temps) où (quand) la classe a changé, et il ne provoquera le gel, mais InvalidClassException.

Autres conseils

Les raisons de mise en garde sont documentées , et les simples corrections sont pour désactiver l'avertissement ou mettre la déclaration suivante dans votre code pour fournir l'UID version. La valeur réelle n'est pas pertinente, commencez par 999 si vous voulez, mais en changeant quand vous apportez des modifications incompatibles à la classe est.

public class HelloWorldSwing extends JFrame {

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

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

sérialisation est ce que vous faites à une instance d'un objet si vous voulez le jeter dans une mémoire tampon brute, enregistrez-le sur le disque, le transporter dans un flux binaire (par exemple, l'envoi d'un objet sur une prise réseau), ou autrement créer une représentation binaire sérialisée d'un objet. (Pour plus d'informations sur la sérialisation voir sérialisation Java sur Wikipédia ).

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

Si vous allez sérialisation, alors vous avez une foule de choses à vous soucier de tous centrés autour de l'utilisation correcte des UUID. Au fond, l'UUID est un moyen de « version » d'un objet que vous sérialisation afin que ce processus est de-sérialisation sait qu'il est dé-sérialisation correctement. Je regardais assurer un contrôle adéquat de version objets sérialisés pour plus d'informations.

  

il doit être changé chaque fois que quelque chose   les changements qui affectent la sérialisation   (champs supplémentaires, champs supprimés,   changement d'ordre sur le terrain, ...)

Ce n'est pas correct, et vous serez incapable de citer une source authoriitative pour cette revendication. Il doit être changé chaque fois que vous faites un changement qui est incompatible selon les règles données dans le Versioning des objets Serializable section objet sérialisation Spécification , qui fait spécifiquement pas comprennent des champs supplémentaires ou changement de l'ordre des champs, et lorsque vous n'avez pas fourni readObject(), writeObject(), et / ou méthodes de readResolve() ou /writeReplace() et / ou une déclaration de serializableFields qui pourrait faire face à ce changement.

Toute classe qui peut être sérialisé (à savoir des instruments Serializable) doit déclarer que UID et il doit être changé chaque fois que quelque chose change qui affecte la sérialisation (champs supplémentaires, les champs supprimés, le changement de l'ordre sur le terrain, ...). La valeur du champ est vérifiée lors de la désérialisation et si la valeur de l'objet sérialisé ne correspond pas à la valeur de la classe dans la machine virtuelle en cours, une exception est levée.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top