6

私はJavafxを使用しており、オブジェクトをListPropertyにラップして、リストのオブジェクトの変更に対してテーブルビューを更新できるようにします。現在、プロジェクトとオブジェクトの ListProperty をシリアル化しようとしていますが、この例外がスローされます。

java.io.NotSerializableException: javafx.beans.property.SimpleListProperty
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1181)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1541)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1506)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1429)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1175)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
at Util.FileManager.serializeProject(FileManager.java:23)
at Controller.FrameworkController.saveProject(FrameworkController.java:549)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:75)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:279)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1435)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:28)
at javafx.event.Event.fireEvent(Event.java:171)
at javafx.scene.control.MenuItem.fire(MenuItem.java:456)
at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.doSelect(ContextMenuContent.java:1197)
at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer$6.handle(ContextMenuContent.java:1148)
at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer$6.handle(ContextMenuContent.java:1146)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:33)
at javafx.event.Event.fireEvent(Event.java:171)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3328)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3168)
at javafx.scene.Scene$MouseHandler.access$1900(Scene.java:3123)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1563)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2265)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:250)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:173)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:292)
at com.sun.glass.ui.View.handleMouseEvent(View.java:528)
at com.sun.glass.ui.View.notifyMouse(View.java:922)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73)
at java.lang.Thread.run(Thread.java:724)

私のプロジェクト クラスはこのようなもので、私自身のすべてのオブジェクトは既にシリアライズ可能を実装しています。

public class Project implements Serializable{

private String name;
private String standard;
private ListProperty<Equipment> projectEquipments;

private ListProperty<LegendElement> equipmentsLegend;

public Project() {
    this.projectEquipments = new SimpleListProperty<Equipment>(FXCollections.observableArrayList(new ArrayList<Equipment>()));

    this.equipmentsLegend = new SimpleListProperty<>(FXCollections.observableList(new ArrayList<LegendElement>()));}

プロジェクトとその中の機器のリストをシリアル化するにはどうすればよいですか?

4

6 に答える 6

4

プロジェクトのカスタム シリアル化を作成する必要があります。

詳細については、次の記事を参照してください。

  1. Java でのカスタム シリアル化に関する StackOverflow の質問
  2. Java でのカスタム シリアライゼーションに関する公式の Oracle チュートリアル

または、 JAXBjavax.jsonなどのテクノロジを使用して、JSON や XML などのテキスト形式を使用してシリアライズを記述することもできます。

すべての JavaFX プロジェクト (および JavaFX 2.x の JavaFX フレームワークのほとんどすべてのオブジェクト) は Serializable を実装していないため、JavaFX プロパティを直接シリアル化することはできません。

于 2013-09-13T17:41:05.123 に答える
1

NotSerializableException を回避するには、次のことを確認してください。

  1. あなたのクラスはSerializableを実装しています
  2. すべての非プリミティブメンバーは Serializable を実装します (または代わりに一時的です)。
  3. クラスが内部クラスの場合、それは静的であるか、外部クラスが Serializable を実装しています

それに加えて、すべての Serializable クラスに対してserialVersionUIDを定義する必要もあります。上記の 3 つのケースすべてに加えて、以下を確認してください。

  1. すべてのシリアライズ可能なスーパークラス
  2. クラスが匿名クラスの場合は、そこでも定義します

注: コードは serialVersionUID なしで実行される場合がありますが、Serializable の javadoc の最後の段落を読んで、なぜそうなるかを理解してください。

環境によっては問題になります。


例外に詳細を追加する VM オプションがあります。ルート クラスとネストされたクラスがシリアル化に失敗していることを示し、不足しているものを把握するのに役立ちます。

-Dsun.io.serialization.extendedDebugInfo=true
于 2014-08-19T03:02:18.117 に答える