2016-03-19 5 views
0

Ich bekomme NotSerializableException seit einiger Zeit. der volle Fehler ist wie dieseGetting NotSerializableException: sun.java2d.SunGraphics2D

java.io.NotSerializableException: sun.java2d.SunGraphics2D 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.writeObject(Unknown Source) 
at SOM_thread1.run(soms1.java:354) 

die Fehler auf out.writeObject sind (g); der vollständige Code ist wie folgt

public class soms1 extends JApplet implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = -743443566771258883L; 

// class of weights and samples which performs operations on the SOM 
public static Screen screen = new Screen(); 

// Socket Connection 
private static Socket clientSocket = null; 
private static PrintStream os = null; 
private static BufferedReader inputLine = null; 


// thread responsible for updating Screen 
static public SOM_thread1 thread = null; 

Toolkit tool; 

public void init() { 
    String sentence; 
    tool = Toolkit.getDefaultToolkit(); 

    try { 
     clientSocket = new Socket("localhost", 6789); 
     thread = new SOM_thread1(clientSocket); 
     setup_applet(); 
     setup_radios(); 
     setup_layout(); 

     screen.init_Screen(); 

     thread.init(); 
     thread.start(); 

     inputLine = new BufferedReader(new InputStreamReader(System.in)); 
     sentence = inputLine.readLine(); 
     if (clientSocket != null && os != null 
       && sentence.equals("server:apl")) { 
      thread.set_state(2); 
     } 
    } catch (UnknownHostException e) { 
     System.err.println(e); 
    } catch (IOException e) { 
     System.err.println(e); 
    } 
} 

} 

class SOM_thread1 extends Thread implements Serializable{ 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

int state = -1; 
int MAX_ITER = 0; 
float t; 
float T_INC; 
private ObjectOutputStream out = null; 
private Socket clientSocket = null; 
public transient Graphics g = null; 

public SOM_thread1(Socket clientSocket) { 
    this.clientSocket = clientSocket; 
} 
/*Updates the class Screen according the to values retrieved from the user interface*/ 
public void run() { 
    while (true) { 
     // Send data to server 
     try { 
      g = soms1.screen.getGraphics(); 
      out = new ObjectOutputStream(clientSocket.getOutputStream()); 
      out.writeObject(g); 
      out.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     // Allow other operations 
     yield(); 
    } // while(true) 

} 
} 

bitte mitteilen, welches Objekt i Dank im Voraus serialisiert werden sollten

Antwort

0

Sie können nicht (sinnvollerweise) serialisiert eine Thread Unterklasse. Die Superklasse Thread enthält einen Status, der inhärent nicht serialisierbar ist.

Und die eigentliche Ausnahme geschieht, weil diese Zeile:

  out.writeObject(g); 

versucht, explizit eine sun.java2d.SunGraphics2D Instanz serialisiert werden. Es ist nicht serialisierbar. Das Beste, was Sie tun könnten, wäre zu versuchen, ein neues Graphics Objekt in dem Kontext zu erstellen, in dem Sie Dinge deserialisieren.

FWIW, es gibt ziemlich viel über Ihren Code, der wenig Sinn für mich macht. Was ist der Zweck der Serialisierung eines Objekts Graphics? Was versuchst du eigentlich zu erreichen?


Ich versuche, die Grafikdaten an den Server über die grafische Objekt zu senden. Dafür habe ich die Screen.getGraphics() -Methode von sun.java2d.SunGraphics2D verwendet. Bildschirm ist nur eine Anzeige-Methode, die grafische Karte generiert.

Grundsätzlich ist das, was Sie versuchen, unmöglich. Der Status des Graphics-Objekts (d. H. Der auf dem Bildschirm angezeigte Inhalt) kann nicht über die Grafik-APIs in einem Format abgerufen werden, mit dem Sie es auf einem neuen Gerät rekonstruieren könnten.

Sie sollten die Quelldaten, die Sie auf dem Gerät gerendert haben, in seiner ursprünglichen Form serialisieren und nach dem Deinserialisieren erneut rendern.

+0

Dank Als Vorschlag versuche ich, die Grafikdaten über ein Grafikobjekt an den Server zu senden. Dafür habe ich die Screen.getGraphics() -Methode von sun.java2d.SunGraphics2D verwendet. Bildschirm ist nur eine Anzeige-Methode, die grafische Karte generiert. Ich versuche das jetzt von etwa einer Woche zu lösen – APL

+0

Nun, im Grunde wird das nicht funktionieren. Sie müssen eine andere Möglichkeit finden, die Grafikdaten zu verschlüsseln, damit Sie sie an den Server senden können. –

+0

Kannst du irgendeinen Weg vorschlagen, von dem ich das Objekt vor dem Senden serialisieren kann? – APL

0

Nun, Sie schreiben Objekt g zurückgegeben von Screen.getGraphics() Methode, die ich nehme (von der Stacktrace) gibt eine Instanz der Klasse sun.java2d.SunGraphics2D zurück.

Wenn man sich seine Unterschrift sehen

public final class SunGraphics2D extends java.awt.Graphics2D implements sun.awt.ConstrainableGraphics, java.lang.Cloneable, sun.java2d.DestSurfaceProvider { 

Sie werden herausfinden, dass es nicht Serializable nicht implementiert und es ist final, so dass es scheint, dass Sie kein Glück ...

+0

können Sie eine Lösung für diesen Fehler vorschlagen? um es einfach zu unterdrücken, damit ich das Objekt senden kann? – APL

+0

Das Unterdrücken der Ausnahme wird Ihnen nicht helfen, da das Grafikobjekt nicht serialisiert wird und Sie nur ein 'Serializable' Objekt senden können. – radoh

+0

also gibt es irgendeine möglichkeit, das objekt vor dem senden serialisieren zu können? – APL