The serializable class does not declare a static final serialVersionUID field of type long

在编译以下Java程序时,出现The serializable class  does not declare a static final serialVersionUID field of type long警告

 1 package learn;
 2 
 3 import javax.swing.*;
 4 import java.awt.*;
 5 import java.awt.event.*;
 6 
 7 public class SimpleGui3C implements ActionListener{
 8     
 9     JFrame frame;
10     
11     public static void main(String[] args) {
12         SimpleGui3C gui = new SimpleGui3C();
13         gui.go();
14     }
15     
16     public void go() {
17         frame = new JFrame();
18         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
19         
20         JButton button = new JButton("Change color");
21         button.addActionListener(this);
22         
23         MyDrawPanel drawPanel = new MyDrawPanel();
24         
25         frame.getContentPane().add(BorderLayout.SOUTH, button);
26         frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
27         frame.setSize(600, 300);
28         frame.setVisible(true);
29     }
30     
31     public void actionPerformed(ActionEvent event) {
32         frame.repaint();
33     }
34 }
View Code
package learn;

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JPanel;

public class MyDrawPanel extends JPanel{
//    private static final long serialVersionUID = 6201378234876555585L;

    public void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        
        int red = (int) (Math.random() * 255);
        int green = (int) (Math.random() * 255);
        int blue = (int ) (Math.random() * 255);
        Color startColor = new Color(red, green, blue);
        
        red = (int) (Math.random() * 255);
        green = (int) (Math.random() * 255);
        blue = (int) (Math.random() * 255);
        Color endColor = new Color(red, green, blue);
        
        GradientPaint gradient = new GradientPaint(70, 70, startColor, 150, 150, endColor);
        g2d.setPaint(gradient);
        g2d.fillOval(70, 70, 100, 100);
    }
}
View Code

为理解这一错误信息,我们得先搞懂几个问题:

Q: What is a serialVersionUID?

A: The serialization runtime associates with each serializable class a version number, called a serialVersionUID, which is used during deserialization to verify that the sender and receiver of a serialized object have loaded classes for that object that are compatible with respect to serialization. If the receiver has loaded a class for the object that has a different serialVersionUID than that of the corresponding sender's class, then deserialization will result in anInvalidClassException. A serializable class can declare its own serialVersionUID explicitly by declaring a field named "serialVersionUID" that must be static, final, and of type long:

private static final long serialVersionUID = 6201378234876555585L;

  SerialVersionUID is a unique identifier for each class, JVM uses it to compare the versions of the class ensuring that the same class was used during Serialization is loaded during Deserialization.You must declare serialVersionUID because it give us more control.

Q:What happen if i don't want to declare a serialVersionUID

A:If a serializable class does not explicitly declare a serialVersionUID, then the serialization runtime will calculate a default serialVersionUID value for that class based on various aspects of the class, as described in the Java(TM) Object Serialization Specification.

  However, it is strongly recommended that all serializable classes explicitly declare serialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpected InvalidClassExceptions during deserialization. Therefore, to guarantee a consistent serialVersionUID value across different java compiler implementations, a serializable class must declare an explicit serialVersionUID value. It is also strongly advised that explicit serialVersionUID declarations use the private modifier where possible, since such declarations apply only to the immediately declaring class--serialVersionUID fields are not useful as inherited members.

Q:Why should I use serialVersionUID?

A:Regardless of what serialized form you choose, declare an explicit serial version UID in every serializable class you write. This eliminates the serial version UID as a potential source of incompatibility (Item 74). There is also a small performance benefit. If no serial version UID is provided, an expensive computation is required to generate one at runtime.

Q:If I wanna ignore such warning , what should i do?

A:Window > Preferences > Java > Compiler > Errors / Warnings > Potential Programming Problems (only eclipse)

posted on 2015-04-22 12:34  沙尘万里  阅读(5556)  评论(0编辑  收藏  举报

导航