Должен ли я сериализовать keyPressed? - PullRequest
0 голосов
/ 11 ноября 2018

Я хочу сохранить некоторые объекты в файл. но я получил java.io.NotSerializableException.

Это полный журнал исключений:

java.io.NotSerializableException: main
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at main$FileOperator.<init>(main.java:484)
    at main.keyPressed(main.java:79)
    at processing.core.PApplet.keyPressed(PApplet.java:3056)
    at processing.core.PApplet.handleKeyEvent(PApplet.java:2931)
    at processing.core.PApplet.dequeueEvents(PApplet.java:2602)
    at processing.core.PApplet.handleDraw(PApplet.java:2440)
    at processing.awt.PSurfaceAWT$12.callDraw(PSurfaceAWT.java:1557)
    at processing.core.PSurfaceNone$AnimationThread.run(PSurfaceNone.java:313)

И я думаю, что из at main.keyPressed(main.java:79) проблема в основном в строке 79, поэтому:

    void keyPressed() {  
if((key == 'F') || (key == 'f')){ 
      println("Save shapes into file");  // Save shapes into file
      value = 6;
      fileIo = new FileOperator(0,shapes);
  }
      if(key == CODED){
        //circle to ellipse
        if((keyCode == CONTROL) && (c.centerIsSet)){
          c.isItAnEllipse = false;
          c.setCircleRadius(sqrt((mouseX+c.x)^2+(mouseY+c.y)^2));
          shapes.add(c);
          c = new Circle();
          System.out.println("  Circle saved\n");
        }
        //Save a polygon if it is a polygon
         else if((keyCode == CONTROL) && (p.savable())){
          p = new Polygon();
          System.out.println("  Polygon finished\n");
        }
        //End a polygon if it isn't a polygon yet
        else if((keyCode == CONTROL) && (p.savable())){ //here is the row 79
          p = new Polygon();
          System.out.println("  Polygon cacelled\n");
        }
        //End a Catmull Rom
        else if(keyCode == CONTROL){
          cr = new CatmullRomManager();
          System.out.println("  CatmullRom spline saved\n");
        }
      }
    }

И у меня есть некоторый класс, например abstract class Shape implements Serializable и class Line extends Shape и некоторые другие, которые расширяют class Shape.

Я пытаюсь сохранить объекты в файл следующим образом:

import java.io.*;
import java.util.Random; 

class FileOperator{
  FileOperator(int io, ArrayList<Shape> shapes){
    if(io == 0){
      try{
        Random rand = new Random(); 
        rand.nextInt(40);
        String filename = "draw" + rand + ".txt";
        FileOutputStream f = new FileOutputStream(new File(filename));
        ObjectOutputStream o = new ObjectOutputStream(f);
        for(Shape s:shapes){
          o.writeObject(s);
        }

        o.close();
        f.close();

      } catch (FileNotFoundException e) {
          System.out.println("ERROR: File not found"); 
      } catch (NotSerializableException e) {
          println("ERROR: trying to serialize: ");
          e.printStackTrace();
      } catch (IOException e) {
          println("ERROR: initializing stream");
          e.printStackTrace(); 
      }

    }else{
      //read
    }
  }
}

Так что я не знаю, но мне интересно, должен ли я как-то сериализовать keyPressed?

Или как мне разрешить это исключение?

1 Ответ

0 голосов
/ 11 ноября 2018

Нет смысла сериализовать функцию. Вы сериализуете экземпляров класса.

Ваша ошибка вызвана попыткой сериализации экземпляра класса, который не сериализуем. Это не имеет ничего общего с функцией , которая не сериализуется.

Проследите по своему коду, чтобы найти класс, который не сериализуем, а затем либо пометьте его как сериализуемый, либо перестаньте пытаться сериализовать его.

Похоже, ваша ошибка говорит о том, что класс main (примечание: соблюдайте стандартные соглашения об именах, классы должны начинаться с заглавной буквы) не поддерживает сериализацию. Может быть, у вас есть внутренний класс или что-то?

...