获取NotSerializableException:sun.java2d.SunGraphics2D
很长一段时间以来,我收到了NotSerializableException。 全部错误如下所示获取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
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()
方法返回的objectg
,我假定该方法(来自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
?不,问题是-那个对象包含什么?你是如何创造它的?你能从图形对象中分离出你想要的数据吗?这是屏幕上的代码,对象从中得到它的值,谢谢你的帮助[链接]