2016-03-19 5 views
0

Я получаю NotSerializableException из довольно долгого времени. полная ошибка как этотПолучение 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) 

ошибка находится на out.writeObject (г); полный код выглядит следующим образом

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) 

} 
} 

пожалуйста, сообщите, какой объект я должен сериализовать заранее спасибо

ответ

0

Вы не можете (полезно) сериализовать Thread подкласс. Суперкласс класса Thread включает состояние, которое по своей сути не является сериализуемым.

И фактическое исключение происходит потому, что эта линия:

  out.writeObject(g); 

явно пытается сериализовать sun.java2d.SunGraphics2D экземпляр. Это не сериализуемо. Лучшее, что вы могли бы сделать, это попытаться создать новый объект Graphics в контексте десериализации вещей.

FWIW, в вашем коде есть много чего, что мне мало смысла. Какова точка сериализации объекта Graphics? Чего вы на самом деле пытаетесь достичь?


Я пытаюсь отправить графические данные на сервер с помощью графического объекта. для этого я использовал метод Screen.getGraphics(), предоставленный sun.java2d.SunGraphics2D. экран - это только метод отображения, который генерирует графическую карту.

В принципе, то, что вы пытаетесь сделать, невозможно. Состояние объекта Graphics (т. Е. Материал, отображаемый на экране) не может быть извлечен через графические API в форме, которая позволила бы восстановить его на новом устройстве.

Вы должны сериализовать исходные данные, которые вы визуализировали на устройстве в его первоначальной форме, и повторно выполнить его после того, как вы его десериализуете.

+0

спасибо для предложения я пытаюсь отправить графические данные на сервер через графический объект. для этого я использовал метод Screen.getGraphics(), предоставленный sun.java2d.SunGraphics2D. экран - это только метод отображения, который генерирует графическую карту. Я пытаюсь решить эту проблему примерно через неделю – APL

+0

Ну, в основном, это не сработает. Вам нужно будет найти другой способ кодирования графических данных, чтобы вы могли отправить его на сервер. –

+0

Можете ли вы предложить любой способ, с помощью которого я могу сериализовать объект перед отправкой? – APL

0

Ну, вы пишете объект g, возвращенный Screen.getGraphics() методом, который я предполагаю (из stacktrace) возвращает экземпляр класса sun.java2d.SunGraphics2D.

Если посмотреть на его подписи

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

вы узнаете, что он не реализует Serializable и это final, так что кажется вам не повезло ...

+0

можете ли вы предложить какое-либо исправление этой ошибки? просто чтобы подавить его, чтобы я мог отправить объект? – APL

+0

Подавление исключения не поможет вам, поскольку оно не будет сериализовать графический объект, и вы можете отправить только объект Serializable. – radoh

+0

, так есть ли способ, которым я могу сериализовать объект перед отправкой? – APL

Смежные вопросы