获取NotSerializableException:sun.java2d.SunGraphics2D

获取NotSerializableException:sun.java2d.SunGraphics2D,java,serialization,Java,Serialization,很长一段时间以来,我收到了NotSerializableException。 全部错误如下所示 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.j

很长一段时间以来,我收到了NotSerializableException。 全部错误如下所示

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(g)上; 完整代码如下所示

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)

}
}
请通知我应该序列化哪个对象 提前感谢

您无法(有效地)序列化
线程
子类。
线程
超类包含本质上不可序列化的状态

实际的异常正在发生,因为这一行:

          out.writeObject(g);
正在显式尝试序列化
sun.java2d.SunGraphics2D
实例。它是不可序列化的。最好是尝试在反序列化内容的上下文中创建一个新的
Graphics
对象

FWIW,你的代码中有很多东西对我来说毫无意义。序列化
图形
对象有什么意义?你到底想达到什么目的


我正在尝试通过图形对象将图形数据发送到服务器。为此,我使用了sun.java2d.SunGraphics2D提供的Screen.getGraphics()方法。屏幕只是一种生成图形地图的显示方法

基本上,你想做的是不可能的。图形对象的状态(即屏幕上显示的内容)无法通过图形API以允许您在新设备上重建的形式检索


您应该序列化以原始形式在设备上呈现的源数据,并在反序列化后重新呈现它。

好吧,您正在编写由
Screen.getGraphics()
方法返回的object
g
,我假定该方法(来自stacktrace)返回类
sun.java2d.SunGraphics2D
的实例

如果你看它的签名

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

你会发现它没有实现
可序列化
,而且它是
最终版
,所以看起来你运气不好…

谢谢你的建议,我正在尝试通过graphic object将图形数据发送到服务器。为此,我使用了sun.java2d.SunGraphics2D提供的Screen.getGraphics()方法。屏幕只是一种生成图形地图的显示方法。我正试图在一周内解决这个问题,基本上,这是行不通的。您需要找到其他方法对图形数据进行编码,以便将其发送到服务器。您能建议我在发送之前序列化对象的任何方法吗?不,我不能。图形对象没有允许您读回图形设备状态及其显示内容的API。你想做的是>>不可能好吧,我想我应该尝试另一种方法。非常感谢您的帮助。您能建议解决此错误吗?只是为了抑制它以便我可以发送对象?抑制异常对您没有帮助,因为它不会序列化图形对象,您只能发送一个
可序列化的
对象。那么,在发送之前我有没有办法序列化对象?
SunGraphics2D
?不,问题是-那个对象包含什么?你是如何创造它的?你能从图形对象中分离出你想要的数据吗?这是屏幕上的代码,对象从中得到它的值,谢谢你的帮助[链接]