java.io.NotSerializableException: javax.swing.GroupLayout



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

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

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

怎么办?

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

  • 使用可序列化的LayoutManager。(我从来不喜欢GroupLayout
  • 子类GroupLayout具有实现Serializable的类。子类应该在自定义writeObject中从超类中复制出所有状态,并在自定义readObject中复制回去(一种变体是使用具有writeReplacereadResolve的串行代理,但这更加复杂(。
  • "手动"在序列化之前删除布局,并在反序列化时手动替换或插入串行代理(具有readResolve方法的LayoutManager(。
  • 使用备用序列化机制。Java序列化现在已经被认真地,公开提议删除。但是,替代序列化机制可能会更糟。
  • 将"手动滚动"的特定序列化器写入 JSON 或类似内容。
  • 不要序列化 UI。这是最好的选择。

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

在尝试序列化持有PropertyChangeSupport的特定类时,您可能会遇到java.io.NotSerializableException: javax.swing.GroupLayout。通过将PropertyChangeSupport更改为transient private PropertyChangeSupport variableName;

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

相关内容

  • 没有找到相关文章

最新更新