Java GLCanvas序列化
在我的应用程序中,我使用JOGL lib与OpenGL一起工作 我需要序列化javax.media.opengl.awt.GLCanvas的实现Java GLCanvas序列化,java,opengl,serialization,jogl,glcanvas,Java,Opengl,Serialization,Jogl,Glcanvas,在我的应用程序中,我使用JOGL lib与OpenGL一起工作 我需要序列化javax.media.opengl.awt.GLCanvas的实现 import javax.media.opengl.*; import javax.media.opengl.awt.GLCanvas; import javax.media.opengl.glu.GLU; import java.io.Serializable; public class Canvas extends GLCanvas implem
import javax.media.opengl.*;
import javax.media.opengl.awt.GLCanvas;
import javax.media.opengl.glu.GLU;
import java.io.Serializable;
public class Canvas extends GLCanvas implements GLEventListener, Serializable {
private GLU glu;
private static final int FPS = 60;
private FPSAnimator animator;
public Canvas() {
addGLEventListener(this);
}
@Override
public void init(GLAutoDrawable drawable) {
drawable.setGL(new DebugGL2(drawable.getGL().getGL2()));
glu = new GLU();
animator = new FPSAnimator(this, FPS);
animator.start();
}
@Override
public void display(GLAutoDrawable drawable) {
if (!animator.isAnimating()) return;
final GL2 gl = drawable.getGL().getGL2();
gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
setCamera(gl, glu, camera.getHeight(), camera.getOrigin());
}
@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
final GL2 gl = drawable.getGL().getGL2();
gl.glViewport(0, 0, width, height);
}
@Override
public void dispose(GLAutoDrawable drawable) {
}
private void setCamera(GL2 gl, GLU glu, float distance, Float origin) {
gl.glMatrixMode(GL2.GL_PROJECTION);
gl.glLoadIdentity();
float widthHeightRatio = (float) getWidth() / (float) getHeight();
glu.gluPerspective(45, widthHeightRatio, 1, 1000);
glu.gluLookAt(origin.x, origin.y, distance, origin.x, origin.y, 0, 0, 1, 0);
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadIdentity();
}
}
我试着写我的画布
fout = new FileOutputStream("F:\\canvas.ser");
oos = new ObjectOutputStream(fout);
oos.writeObject(mCanvas);
但我有一个错误:
java.io.NotSerializableException: com.jogamp.nativewindow.awt.AWTGraphicsConfiguration
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 com.pms.efficiency.VideoEffectiveApplication.saveFileAs(VideoEffectiveApplication.java:328)
at com.pms.efficiency.VideoEffectiveApplication.lambda$initMenu$1(VideoEffectiveApplication.java:215)
at java.awt.MenuItem.processActionEvent(MenuItem.java:669)
at java.awt.MenuItem.processEvent(MenuItem.java:628)
at java.awt.MenuComponent.dispatchEventImpl(MenuComponent.java:351)
at java.awt.MenuComponent.dispatchEvent(MenuComponent.java:339)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:761)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
因此,GLCanvas中的字段是不可序列化的。我能做什么?不确定这是否能解决您的问题,但是
javax.media.opengl
建议您使用的是过时的jogl版本。您可以使用反射API在序列化期间将不可序列化字段设置为null,或者将GLCanvas包装到实现可外部化的自定义类中,并完全覆盖默认序列化,但这非常困难:s