0

我有这段代码,它抛出异常

java.io.NotSerializableException: javax.swing.GroupLayout

代码如下

package basededatosmuebleria;
import FrontEnd.VentanaIngresoMedianteArchivo;
import java.io.*;
import javax.swing.JOptionPane;

public class FileController implements Serializable {
    public static void escribirObjetoPieza(String nombre, Pieza pieza){
        try{
            ObjectOutputStream fileOut = new ObjectOutputStream(
        new FileOutputStream(nombre));
        fileOut.writeObject(pieza);
        fileOut.close();
        }
        catch (IOException e){ 
            JOptionPane.showMessageDialog(null, e);
        }
    }
}

发送调用该方法的类如下...

package basededatosmuebleria;
import FrontEnd.VentanaIngresoMedianteArchivo;
import static java.lang.Double.parseDouble;
import java.util.StringTokenizer;
import java.io.*;

public class Pieza implements Serializable {
    String tipo;
    double costo;
    VentanaIngresoMedianteArchivo comunicador = new                     
    VentanaIngresoMedianteArchivo();
    public Pieza(String tipo, double costo){
        this.tipo=tipo;
        this.costo=costo;
    }
    public Pieza(){}
    public String getTipo(){
        return this.tipo;
    }
    public double getCostoPieza(){
        return this.costo;
    }
    public void evaluarLinea(String line) {
            try{
            StringTokenizer token = new StringTokenizer(line,",");
            tipo=token.nextToken()
                    .replaceAll("PIEZA", "")
                    .replace("(", "")
                    .replaceAll("\"","");
            costo=parseDouble(token.nextToken()
                    .replace(")",""));
            Pieza pieza = new Pieza (tipo, costo);
            int contador = FileController.leerContadorPiezas(tipo);
            String nombreDelObjeto=
                    "Pieza"
                    +tipo
                    +String.valueOf(contador)
                    +".dat";
            FileController.escribirObjetoPieza(nombreDelObjeto, pieza);   
        }
        catch(NullPointerException e){
            VentanaIngresoMedianteArchivo.cajaDeMensajes.append("No se ha ingresado un valor en el precio de la pieza");
        }
        catch(NumberFormatException e){
            VentanaIngresoMedianteArchivo.cajaDeMensajes.append("El formato ingresado es incorrecto. no es un numero real");
        }
    }  
}
4

2 回答 2

1

如果您碰巧在使用 Javax.swing 并且您一直在使用PropertyChangeSupport来保持 Windows 同步(或其他目的)。

您可能会java.io.NotSerializableException: javax.swing.GroupLayout在尝试序列化持有PropertyChangeSupport. 通过更改PropertyChangeSupporttransient private PropertyChangeSupport variableName;,

初始化时,您可以解决此错误。

于 2021-11-03T12:16:02.147 回答
1

正如异常消息所述,javax.swing.GroupLayout不可序列化。

该怎么办?

在这种情况下,您最喜欢的 Java 序列化参考应该为您提供选项。简而言之,您的选择是:

  • 使用可序列化的LayoutManager. (我从不喜欢GroupLayout。)
  • GroupLayout具有实现的类的子类Serializable。子类应该在自定义中从超类中复制所有状态并在自定义writeObject中复制回readObject(一种变体是使用带有writeReplaceand的串行代理readResolve,但这更加复杂)。
  • “手动”在序列化之前删除布局,并在反序列化时手动替换或插入串行代理(LayoutManager带有readResolve方法)。
  • 使用另一种序列化机制。Java 序列化现在已经被严肃地、公开地提议移除。然而,替代的序列化机制可能会更糟。
  • 为 JSON 或类似内容编写一个“手动”特定的序列化程序。
  • 不要序列化 ​​UI。这是最好的选择。
于 2018-05-27T21:53:29.953 回答