Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4278819

JMenuBars are damaged by serialization (they can't be serialized twice)

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: P3 P3
    • 1.4.0
    • 1.3.0
    • client-libs
    • beta
    • x86
    • windows_nt

      v

      Name: clC74495 Date: 10/06/99


      Carlos.Lucasius@Canada (October 6, 1999): regression of bug 4110285?

      /***************************************************************************

      JMenuBars are damaged by serialization (they can't be serialized twice)

      JMenuBars are damaged when they are serialized, such that they can't be
      serialized twice in a row. This sample program can be used to
      demonstrate the problem; it opens a window with a simple JMenuBar and
      a button marked "Serialize".

      Run the program and push the "Serialize" button; it seems to be work. But
      look closely at the JMenuBar; the border is now missing! It looks like
      the border was not properly re-installed at the end of the normal
      serialization kludge.

      Now press the "Serialize" button again; this time you get a
      NullPointerException.

      This bug is pretty important if you are building an IDE that supports
      visual editing of menus.

      This problem happens with this build (but it's been broken for years):

        java version "1.3.0"
        Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0-G)
        Java HotSpot(TM) Client VM (build 1.3-G, mixed mode)


      This bug can be easily fixed in JMenuBar.java by adding this block of
      code to the writeObject method, just after the call to s.defaultWriteObject():

              if ((ui != null) && (getUIClassID().equals(uiClassID)))
              {
                  ui.installUI(this);
              }

      Here is the output from the sample program:

      Serializing...
      Serialization complete.
      Serializing...
      Exception occurred during event dispatching:
      java.lang.NullPointerException
              at javax.swing.LookAndFeel.uninstallBorder(LookAndFeel.java:123)
              at javax.swing.plaf.basic.BasicMenuBarUI.uninstallDefaults(BasicMenuBarUI.java:143)
              at javax.swing.plaf.basic.BasicMenuBarUI.uninstallUI(BasicMenuBarUI.java:135)
              at javax.swing.JComponent.compWriteObjectNotify(JComponent.java:4428)
              at javax.swing.JComponent$EnableSerializationFocusListener.writeObject(JComponent.java:4418)
              at java.lang.reflect.Method.invoke(Native Method)
              at java.io.ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java:1811)
              at java.io.ObjectOutputStream.outputObject(ObjectOutputStream.java:1186)
              at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:362)
              at java.awt.AWTEventMulticaster.save(AWTEventMulticaster.java:767)
              at java.awt.Component.writeObject(Component.java:4463)
              at java.lang.reflect.Method.invoke(Native Method)
              at java.io.ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java:1811)
              at java.io.ObjectOutputStream.outputObject(ObjectOutputStream.java:1186)
              at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:362)
              at java.io.ObjectOutputStream.outputArray(ObjectOutputStream.java:1074)
              at java.io.ObjectOutputStream.checkSubstitutableSpecialClasses(ObjectOutputStream.java:452)
              at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:357)
              at java.io.ObjectOutputStream.outputClassFields(ObjectOutputStream.java:1774)
              at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:473)
              at java.awt.Container.writeObject(Container.java:1859)
              at java.lang.reflect.Method.invoke(Native Method)
              at java.io.ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java:1811)
              at java.io.ObjectOutputStream.outputObject(ObjectOutputStream.java:1186)
              at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:362)
              at java.io.ObjectOutputStream.outputArray(ObjectOutputStream.java:1074)
              at java.io.ObjectOutputStream.checkSubstitutableSpecialClasses(ObjectOutputStream.java:452)
              at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:357)
              at java.io.ObjectOutputStream.outputClassFields(ObjectOutputStream.java:1774)
              at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:473)
              at java.awt.Container.writeObject(Container.java:1859)
              at java.lang.reflect.Method.invoke(Native Method)
              at java.io.ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java:1811)
              at java.io.ObjectOutputStream.outputObject(ObjectOutputStream.java:1186)
              at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:362)
              at java.io.ObjectOutputStream.outputArray(ObjectOutputStream.java:1074)
              at java.io.ObjectOutputStream.checkSubstitutableSpecialClasses(ObjectOutputStream.java:452)
              at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:357)
              at java.io.ObjectOutputStream.outputClassFields(ObjectOutputStream.java:1774)
              at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:473)
              at java.awt.Container.writeObject(Container.java:1859)
              at java.lang.reflect.Method.invoke(Native Method)
              at java.io.ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java:1811)
              at java.io.ObjectOutputStream.outputObject(ObjectOutputStream.java:1186)
              at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:362)
              at MenuBarTest.actionPerformed(MenuBarTest.java:147)
              at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1244)
              at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1296)
              at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:378)
              at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:250)
              at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:238)
              at java.awt.Component.processMouseEvent(Component.java:3677)
              at java.awt.Component.processEvent(Component.java:3506)
              at java.awt.Container.processEvent(Container.java:1255)
              at java.awt.Component.dispatchEventImpl(Component.java:2563)
              at java.awt.Container.dispatchEventImpl(Container.java:1304)
              at java.awt.Component.dispatchEvent(Component.java:2466)
              at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:2550)
              at java.awt.LightweightDispatcher.processMouseEvent(Container.java:2315)
              at java.awt.LightweightDispatcher.dispatchEvent(Container.java:2218)
              at java.awt.Container.dispatchEventImpl(Container.java:1291)
              at java.awt.Window.dispatchEventImpl(Window.java:872)
              at java.awt.Component.dispatchEvent(Component.java:2466)
              at java.awt.EventQueue.dispatchEvent(EventQueue.java:322)
              at java.awt.EventDispatchThread.pumpOneEvent(EventDispatchThread.java:107)
              at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:97)
              at java.awt.EventDispatchThread.run(EventDispatchThread.java:88)
      *****************************************************************************/

      import java.awt.*;
      import java.awt.event.*;
      import java.io.*;
      import javax.swing.*;

      public class MenuBarTest implements ActionListener
      {
          public static void main(String args[])
          {
              new MenuBarTest();
          }

          JFrame jf1;
          JButton jb1;
          JMenuBar mb;
          JMenuItem mi;
          JMenu m;

          public MenuBarTest()
          {
              jf1 = new JFrame("Test JMenuBar Serialization");
              jb1 = new JButton("Serialize");
          
              jf1.setSize(300,100);
              jf1.getContentPane().setLayout(new FlowLayout());
              jf1.getContentPane().add(jb1);
                                      
              mb = new JMenuBar();
                  m = new JMenu("Menu",true);
                      mi = new JMenuItem("MenuItem");
                      m.add(mi);
              mb.add(m);

              jf1.setJMenuBar(mb);

              jb1.addActionListener(this);
              jf1.show();
          }

          public void actionPerformed(ActionEvent e)
          {
              if (e.getSource() == jb1)
              {
                  System.out.println("Serializing...");
                  try
                  {
                      FileOutputStream ostream;
                      ObjectOutputStream p;
                      ostream = new FileOutputStream("test.out");
                      p = new ObjectOutputStream(ostream);

                      p.writeObject(jf1);
                      p.flush();
                      ostream.close();
                  }
                  catch (IOException ie)
                  {
                      ie.printStackTrace();
                      System.exit(0);
                  }
                  System.out.println("Serialization complete.");
              }
          }
      }
      (Review ID: 96110)
      ======================================================================

            mdavidsosunw Mark Davidson (Inactive)
            clucasius Carlos Lucasius (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: