应用程序序列化错误,java.io.NotSerializableException:
Error in serialization of the application, java.io.NotSerializableException:
我正在尝试使用 Google 云平台(Eclipse 中的一个插件)在 google 云平台中 运行 一个 Vaadin 项目。在 运行ning 之后我得到这个异常:
WARNING: Error in serialization of the application: Class
rand.TestProject.AutoCrudView must implement serialization.
2019-03-02 15:54:06.159:WARN:oejs.session:qtp1757676444-19:
java.io.NotSerializableException: java.lang.ref.WeakReference
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.LinkedList.writeObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
这是 AutoCrudView class:
@SuppressWarnings("serial")
public class AutoCrudView extends Window implements Serializable{
private static final long serialVersionUID = 1L;
public AutoCrudView(String PERSISTENCE_UNIT) {
final HorizontalSplitPanel horizontalSplitPanel = new HorizontalSplitPanel();
Tree navTree = new Tree();
navTree.addListener(new Property.ValueChangeListener() {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void valueChange(ValueChangeEvent event) {
@SuppressWarnings("rawtypes")
BasicCrudView cv = (BasicCrudView) event.getProperty()
.getValue();
cv.refreshContainer();
horizontalSplitPanel.setSecondComponent(cv);
}
});
navTree.setSelectable(true);
navTree.setNullSelectionAllowed(false);
navTree.setImmediate(true);
horizontalSplitPanel.setSplitPosition(200,
HorizontalSplitPanel.UNITS_PIXELS);
horizontalSplitPanel.addComponent(navTree);
setContent(horizontalSplitPanel);
// add a basic crud view for all entities known by the JPA
// implementation, most often this is not desired and developers
// should just list those entities they want to have editors for
Metamodel metamodel = JPAContainerFactory
.createEntityManagerForPersistenceUnit(PERSISTENCE_UNIT)
.getEntityManagerFactory().getMetamodel();
Set<EntityType<?>> entities = metamodel.getEntities();
for (EntityType<?> entityType : entities) {
Class<?> javaType = entityType.getJavaType();
@SuppressWarnings({ "rawtypes", "unchecked" })
BasicCrudView view = new BasicCrudView(javaType,
PERSISTENCE_UNIT);
navTree.addItem(view);
navTree.setItemCaption(view, view.getCaption());
navTree.setChildrenAllowed(view, false);
if(javaType == Person.class) {
view.setVisibleTableProperties("firstName","lastName", "boss");
view.setVisibleFormProperties("firstName","lastName", "phoneNumber", "street", "city", "zipCode", "boss");
}
}
// select first entity view
navTree.setValue(navTree.getItemIds().iterator().next());
}
}
如您所见,我已经实现了 Serializable,但没有成功。
这是我从 App Engine window 获得的图像:
here
您收到有关匿名内部 class(class 名称末尾的 $1)而不是实际 class 本身的警告。
所以:去寻找你(不小心)创建一个内部 class 实例的地方,并尝试保留那个实例。
也许
new(...) {
将更改侦听器添加到树对象的位置。
如果是这样,问题将是侦听器是否应该是一个应该实现该接口的不同 class。或者,如果您只是通过尝试保留具有此类侦听器的内容来做错事(我不是该框架的专家,我发现保留 ui 元素(包括侦听器实例)是可疑的。
您可以尝试在单独的文件中声明Property.ValueChangeListener并检查。
我正在尝试使用 Google 云平台(Eclipse 中的一个插件)在 google 云平台中 运行 一个 Vaadin 项目。在 运行ning 之后我得到这个异常:
WARNING: Error in serialization of the application: Class
rand.TestProject.AutoCrudView must implement serialization.
2019-03-02 15:54:06.159:WARN:oejs.session:qtp1757676444-19:
java.io.NotSerializableException: java.lang.ref.WeakReference
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.LinkedList.writeObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
这是 AutoCrudView class:
@SuppressWarnings("serial")
public class AutoCrudView extends Window implements Serializable{
private static final long serialVersionUID = 1L;
public AutoCrudView(String PERSISTENCE_UNIT) {
final HorizontalSplitPanel horizontalSplitPanel = new HorizontalSplitPanel();
Tree navTree = new Tree();
navTree.addListener(new Property.ValueChangeListener() {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void valueChange(ValueChangeEvent event) {
@SuppressWarnings("rawtypes")
BasicCrudView cv = (BasicCrudView) event.getProperty()
.getValue();
cv.refreshContainer();
horizontalSplitPanel.setSecondComponent(cv);
}
});
navTree.setSelectable(true);
navTree.setNullSelectionAllowed(false);
navTree.setImmediate(true);
horizontalSplitPanel.setSplitPosition(200,
HorizontalSplitPanel.UNITS_PIXELS);
horizontalSplitPanel.addComponent(navTree);
setContent(horizontalSplitPanel);
// add a basic crud view for all entities known by the JPA
// implementation, most often this is not desired and developers
// should just list those entities they want to have editors for
Metamodel metamodel = JPAContainerFactory
.createEntityManagerForPersistenceUnit(PERSISTENCE_UNIT)
.getEntityManagerFactory().getMetamodel();
Set<EntityType<?>> entities = metamodel.getEntities();
for (EntityType<?> entityType : entities) {
Class<?> javaType = entityType.getJavaType();
@SuppressWarnings({ "rawtypes", "unchecked" })
BasicCrudView view = new BasicCrudView(javaType,
PERSISTENCE_UNIT);
navTree.addItem(view);
navTree.setItemCaption(view, view.getCaption());
navTree.setChildrenAllowed(view, false);
if(javaType == Person.class) {
view.setVisibleTableProperties("firstName","lastName", "boss");
view.setVisibleFormProperties("firstName","lastName", "phoneNumber", "street", "city", "zipCode", "boss");
}
}
// select first entity view
navTree.setValue(navTree.getItemIds().iterator().next());
}
}
如您所见,我已经实现了 Serializable,但没有成功。 这是我从 App Engine window 获得的图像: here
您收到有关匿名内部 class(class 名称末尾的 $1)而不是实际 class 本身的警告。
所以:去寻找你(不小心)创建一个内部 class 实例的地方,并尝试保留那个实例。
也许
new(...) {
将更改侦听器添加到树对象的位置。 如果是这样,问题将是侦听器是否应该是一个应该实现该接口的不同 class。或者,如果您只是通过尝试保留具有此类侦听器的内容来做错事(我不是该框架的专家,我发现保留 ui 元素(包括侦听器实例)是可疑的。
您可以尝试在单独的文件中声明Property.ValueChangeListener并检查。