java.io.NotSerializableException: javax.swing.GroupLayout - PullRequest
0 голосов
/ 21 мая 2018

У меня есть этот код, и он выдает исключение

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

1 Ответ

0 голосов
/ 28 мая 2018

Как говорится в сообщении об исключении, javax.swing.GroupLayout не сериализуемо.

Что делать?

Ваш любимый справочник по сериализации Java должен дать вам варианты в этом случае.Вкратце вы можете выбрать:

  • Использовать сериализуемый LayoutManager.(Мне никогда не нравился GroupLayout.)
  • Подкласс GroupLayout с классом, который реализует Serializable.Подкласс должен копировать все состояние из суперкласса в пользовательском writeObject и копировать обратно в пользовательский readObject (вариант заключается в использовании последовательного прокси с writeReplace и readResolve, но это дажеусложнение).
  • «Вручную» удалить макет перед сериализацией и либо вручную заменить при десериализации, либо вставить последовательный прокси (a LayoutManager с помощью метода readResolve).
  • Использоватьальтернативный механизм сериализации.Сериализация Java теперь серьезно, публично предложена для удаления.Тем не менее, альтернативные механизмы сериализации, вероятно, будут намного хуже.
  • Записывайте «свернутый вручную» конкретный сериализатор в JSON или аналогичный.
  • Не сериализуйте пользовательский интерфейс.Это лучший выбор.
...