java.io.NotSerializableException: javax.swing.GroupLayout
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);
}
}
}
发送的class调用方法如下...
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
。)
- Subclass
GroupLayout
与实现 Serializable
的 class。 subclass 应该在自定义 writeObject
中从 superclass 复制所有状态,然后在自定义 readObject
中复制回来(一种变体是使用writeReplace
和 readResolve
的串行代理,但这更复杂)。
- "Manually" 在序列化之前删除布局,并在反序列化时手动替换或插入串行代理(
LayoutManager
和 readResolve
方法)。
- 使用替代序列化机制。 Java 连载现在已经严重了,公开建议下架。但是,替代的序列化机制可能会更糟。
- 写一个 "hand-rolled" 特定的序列化器到 JSON 或类似的。
- 不要序列化 UI。这是最好的选择。
如果您碰巧在使用 Javax.swing 并且一直在使用 PropertyChangeSupport
来保持 windows 同步(或其他目的)。
在尝试序列化持有 PropertyChangeSupport
的特定 class 时,您可能会得到 java.io.NotSerializableException: javax.swing.GroupLayout
。通过将 PropertyChangeSupport
更改为 transient private PropertyChangeSupport variableName;
、
初始化时您可以解决此错误。
我有这段代码,它抛出异常
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);
}
}
}
发送的class调用方法如下...
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
。) - Subclass
GroupLayout
与实现Serializable
的 class。 subclass 应该在自定义writeObject
中从 superclass 复制所有状态,然后在自定义readObject
中复制回来(一种变体是使用writeReplace
和readResolve
的串行代理,但这更复杂)。 - "Manually" 在序列化之前删除布局,并在反序列化时手动替换或插入串行代理(
LayoutManager
和readResolve
方法)。 - 使用替代序列化机制。 Java 连载现在已经严重了,公开建议下架。但是,替代的序列化机制可能会更糟。
- 写一个 "hand-rolled" 特定的序列化器到 JSON 或类似的。
- 不要序列化 UI。这是最好的选择。
如果您碰巧在使用 Javax.swing 并且一直在使用 PropertyChangeSupport
来保持 windows 同步(或其他目的)。
在尝试序列化持有 PropertyChangeSupport
的特定 class 时,您可能会得到 java.io.NotSerializableException: javax.swing.GroupLayout
。通过将 PropertyChangeSupport
更改为 transient private PropertyChangeSupport variableName;
、
初始化时您可以解决此错误。