Was bedeutet es: Die serializable Klasse kein statisches endgültiges serialVersionUID Feld deklarieren? [Duplikat]

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

Frage

    

Diese Frage bereits eine Antwort hier:

         

Ich habe die Warnmeldung im Titel angegeben. Ich möchte es verstehen und zu entfernen. Ich fand schon einige Antworten auf diese Frage, aber ich verstehe nicht, diese Antworten aufgrund von Überlastung mit technischen Begriffen. Ist es möglich, dieses Problem mit einfachen Worten zu erklären?

P. S. Ich weiß, was OOP ist. Ich weiß, was Objekt, Klasse, Methode, Feld und Instanziierung.

P.P.S. Wenn jemand meinen Code braucht es 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();
                }
            });
        }

}
War es hilfreich?

Lösung

Von der javadoc :

  

Die Serialisierung Runtime ordnet jede serializable Klasse einer Versionsnummer, ein serialVersionUID genannt, die bei der Deserialisierung verwendet wird, um zu überprüfen, dass der Sender und Empfänger eines serialisierten Objekt haben geladene Klassen für das Objekt, das in Bezug auf der Serialisierung kompatibel ist. Wenn der Empfänger eine Klasse für das Objekt geladen ist, die eine andere serialVersionUID als die des entsprechenden Senders Klasse hat, wird dann Deserialisierung in einem InvalidClassException führen. Eine serializable Klasse kann seine eigene serialVersionUID erklären ausdrücklich durch ein Feld namens "serialVersionUID" erklärt, die statisch sein müssen, endgültig und vom Typ long:

Sie können Ihre IDE konfigurieren:

  • ignorieren diese, sondern eine Warnung zu geben.
  • automatisch generiert eine ID

Wie pro Ihre weitere Frage: „Kann es sein, dass die diskutierten Warnmeldung ist ein Grund, warum meine GUI-Anwendung einfrieren?“:

Nein, kann es nicht sein. Es kann ein Problem verursacht nur, wenn Sie Objekte der Serialisierung und Deserialisierung sie an einem anderen Ort (oder Zeit), wo (wenn) die Klasse geändert hat, und es wird in dem Einfrieren, aber in InvalidClassException nicht zur Folge hat.

Andere Tipps

Die anderen Antworten haben bisher eine Menge technischer Informationen. Ich werde Antwort versuchen, wie gewünscht, in einfachen Worten.

Serialisierung ist, was Sie auf eine Instanz eines Objekts zu tun, wenn Sie es zu einem rohen Puffer entleeren wollen, speichern sie auf der Festplatte, transportiert sie in einem binären Strom (zB ein Objekt über einen Netzwerk-Socket senden) oder auf andere Weise eine serialisierte binäre Darstellung eines Objekts erstellen. (Für weitere Informationen über die Serialisierung Java Serialisierung auf Wikipedia ).

Wenn Sie nicht die Absicht, die Serialisierung der Klasse haben, können Sie die Anmerkung direkt über Ihre Klasse @SuppressWarnings("serial") hinzuzufügen.

Wenn Sie serialisiert werden, dann haben Sie eine Vielzahl von Dingen zu Sorgen über alles rund um die ordnungsgemäße Verwendung der UUID zentriert. Grundsätzlich ist die UUID eine Möglichkeit, „Version“ ein Objekt Sie serialisiert würde so dass alles, was Prozess de-Serialisierung ist weiß, dass es de-Serialisierung richtig. Ich würde Blick auf auf korrekte Versionskontrolle für serialisierte Objekte für weitere Informationen.

  

muss es geändert werden, wenn irgendetwas   Änderungen, die die Serialisierung beeinflusst   (Zusätzliche Felder, entfernt Felder,   Änderung der Feld Ordnung, ...)

Das ist nicht richtig, und Sie werden nicht in der Lage eine authoriitative Quelle für diesen Anspruch zu zitieren. Es sollte geändert werden, wenn Sie eine Änderung vornehmen, die in der Versionierung von Serializable Objekte Abschnitt der Objekt Serialisierung Spezifikation , die speziell tut nicht sind zusätzliche Felder oder eine Änderung der Feldreihenfolge, und , wenn Sie nicht zur Verfügung gestellt readObject(), writeObject(), haben und / oder readResolve() oder /writeReplace() Verfahren und / oder eine serializableFields Erklärung, dass mit der Änderung bewältigen könnte.

Jede Klasse, die serialisiert werden kann (das heißt Geräte Serializable) sollten erklären, dass UID und es muss immer dann, wenn sich etwas ändert geändert werden, die die Serialisierung (zusätzliche Felder, entfernte Felder, Änderung der Feldreihenfolge, ...) beeinflusst. Der Wert des Feldes wird bei der Deserialisierung geprüft, und wenn der Wert des serialisierten Objekts nicht den Wert der Klasse in der aktuellen VM gleich, wird eine Ausnahme ausgelöst.

Beachten Sie, dass dieser Wert besonders ist, dass es mit dem Objekt serialisiert wird, obwohl sie statisch ist, für die oben beschriebenen Gründe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top