Wat betekent het: de serializable klasse verklaart niet een static definitief serialversionuid veld? [DUPLICEER]

Ik heb het waarschuwingsbericht in de titel. Ik zou het willen begrijpen en verwijderen. Ik vond al enkele antwoorden op deze vraag, maar ik begrijp deze antwoorden niet vanwege een overbelasting met technische termen. Is het mogelijk om dit probleem met eenvoudige woorden uit te leggen?

P.S. Ik weet wat OOP is. Ik weet wat object, klasse, methode, veld en instantiatie is.

p.p.s. Als iemand mijn code nodig heeft, is het hier:

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();
                }
            });
        }
}

Antwoord 1, Autoriteit 100%

van de javadoc :

De serialisatie-runtime-medewerkers met elke serializable klasse A-versienummer, een serialVersionUID, die wordt gebruikt tijdens de deserialization om te controleren of de afzender en ontvanger van een geserialiseerd object klassen voor dat object hebben geladen die zijn compatibel met betrekking tot serialisatie. Als de ontvanger een klasse heeft geladen voor het object met een andere serialVersionUIDdan die van de bijbehorende de klasse van de afzender, zal Deserialization resulteren in een InvalidClassException. Een serializable klasse kan zijn eigen serialVersionUIDuitdrukkelijk verklaren door een veld met de naam "serialVersionUID"te verklaren, dat statisch, definitief en van het type lang moet zijn:

U kunt uw IDE configureren om:

  • negeer dit, in plaats van een waarschuwing te geven.
  • Autogenereer een ID

Zoals uw aanvullende vraag “kan het zijn dat het besproken waarschuwingsbericht een reden is waarom mijn GUI-applicatie bevriezen?”:

Nee, het kan niet zijn. Het kan alleen een probleem veroorzaken als u objecten in het serieen en ze in een andere plaats (of tijd) serialiseert, waar (wanneer) de klasse is gewijzigd en het niet zal resulteren in bevriezing, maar in InvalidClassException.


Antwoord 2, Autoriteit 26%

De andere antwoorden hebben tot nu toe veel technische informatie. Ik zal proberen te antwoorden, zoals gevraagd, in eenvoudige termen.

Serialisatie is wat u doet met een instantie van een object als u het naar een onbewerkte buffer wilt dumpen, het op schijf wilt opslaan, het in een binaire stroom wilt transporteren (bijvoorbeeld een object verzenden via een netwerksocket), of anderszins maak een geserialiseerde binaire weergave van een object. (Voor meer informatie over serialisatie, zie Java-serialisatie op Wikipedia).

Als je niet van plan bent je klas te serialiseren, kun je de annotatie net boven je klas toevoegen @SuppressWarnings("serial").

Als je gaat serialiseren, heb je een heleboel dingen om je zorgen over te maken, allemaal gericht op het juiste gebruik van UUID. Kortom, de UUID is een manier om een object te “versieren” dat u zou serialiseren, zodat elk proces dat de-serialiseert, weet dat het correct de-serialiseert. Ik zou kijken naar Zorg voor het juiste versiebeheer voor geserialiseerde objectenvoor meer informatie.


Antwoord 3, autoriteit 22%

De redenen voor de waarschuwing zijn hiergedocumenteerd en de eenvoudige oplossingen zijn om de waarschuwing uit te schakelen of de volgende verklaring in uw code te plaatsen om de versie UID te leveren. De werkelijke waarde is niet relevant, begin met 999 als je wilt, maar veranderen als je onverenigbare wijzigingen aanbrengt in de klasse is dat wel.

public class HelloWorldSwing extends JFrame {
        JTextArea m_resultArea = new JTextArea(6, 30);
        private static final long serialVersionUID = 1L;

Antwoord 4, autoriteit 16%

het moet altijd worden gewijzigd
wijzigingen die de serialisatie beïnvloeden
(extra velden, verwijderde velden,
verandering van veldvolgorde, …)

Dat is niet correct en u kunt geen gezaghebbende bron voor die bewering citeren. Het moet worden gewijzigd wanneer u een wijziging aanbrengt die incompatibel is volgens de regels in de Versiebeheer van seriële objectenvan de Object Serialisatiespecificatie, die specifiek geenextra velden of wijziging van veldvolgorde bevat, enwanneer u readObject(), writeObject(),en/of readResolve()of /writeReplace()methoden en/of een serializableFieldsverklaring die de verandering aankan.


Antwoord 5, autoriteit 3%

Elke klasse die kan worden geserialiseerd (dwz Serializableimplementeert) moet die UID declareren en deze moet worden gewijzigd wanneer er iets verandert dat de serialisatie beïnvloedt (extra velden, verwijderde velden, wijziging van veldvolgorde, . ..). De waarde van het veld wordt gecontroleerd tijdens deserialisatie en als de waarde van het geserialiseerde object niet gelijk is aan de waarde van de klasse in de huidige VM, wordt een uitzondering gegenereerd.

Houd er rekening mee dat deze waarde speciaal is omdat deze is geserialiseerd met het object, ook al is het statisch, om de hierboven beschreven redenen.

Other episodes