125

私にはこの例外があり、なぜそれがスローされるのか、またはどのように処理する必要があるのか​​わかりません。

try {
    os.writeObject(element);
} catch (IOException e) {
    e.printStackTrace();
}

クラスAtomの他のインスタンスを含む場所elementは次のとおりです。TransformGroupTransformGroups

public class Atom extends Group implements Serializable{
    float pozX,pozY;
    Group group= new Group();   
    Color3f blue = new Color3f(new Color(255));
    Color3f black = new Color3f(new Color(0));
    Sphere AtSph=new Sphere();

    public Atom(final float WEIGHT, final int BOUNDS,final float radius,Color3f color)
    {
        AppSetting ap= new AppSetting(color, black);
        AtSph=new Sphere(radius,1,100,ap);
    }
}

完全なエラーログ:

java.io.NotSerializableException: javax.media.j3d.TransformGroup
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at cls.MolecularBuilder.addAtom(MolecularBuilder.java:511)
    at cls.MolecularBuilder$Console.HidrogenItemActionPerformed(MolecularBuilder.java:897)
    at cls.MolecularBuilder$Console$2.actionPerformed(MolecularBuilder.java:746)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.AbstractButton.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

AppSetting(Atomクラス内)は、Appearanceを拡張する単なるカスタムクラスです。

4

4 に答える 4

235

オブジェクトのフィールドには、順番にフィールドがあり、そのうちのいくつかはを実装していませんSerializable。あなたの場合、問題のあるクラスはTransformGroupです。それを解決する方法は?

  • クラスがあなたのものなら、それを作ってくださいSerializable
  • クラスがサードパーティであるが、シリアル化された形式で必要ない場合は、フィールドに次のようにマークを付けますtransient
  • データが必要でサードパーティの場合は、JSON、XML、BSON、MessagePackなど、定義を変更せずにサードパーティのオブジェクトをシリアル化できる他のシリアル化手段を検討してください。
于 2012-12-15T20:26:14.717 に答える
86

java.io.NotSerializableException内部クラスインスタンスをシリアル化すると、次の理由で発生する可能性があります。

このような内部クラスインスタンスをシリアル化すると、関連する外部クラスインスタンスもシリアル化されます。

ローカルクラスや匿名クラスを含む内部クラス(つまり、静的メンバークラスではないネストされたクラス)のシリアル化は 強くお勧めしません。

参照:シリアル化可能なインターフェイス

于 2015-01-22T03:37:25.697 に答える
10

インターフェイスを実装して、クラスをシリアライズ可能にしますjava.io.Serializable

  • java.io.Serializable-メソッドが含まれていないマーカーインターフェイス。
  • マーカーインターフェイスの目的-ObjectOutputStreamこのオブジェクトがシリアル化可能なオブジェクトであることを通知します。
于 2014-01-07T12:28:35.247 に答える
1

上記のように、クラスがサードパーティクラスの場合、サードパーティクラスオブジェクトはシリアル化できないため、JSON / XML/BSONオブジェクトに変換する必要があります。

私は自分のプロジェクトに取り組んでいて、同じ問題があり、gsonライブラリを使用してクラスオブジェクトをJSON文字列に変換しました。その後、そのオブジェクトでこの文字列を使用し、ObjectOutputStreamオブジェクトを介して渡しました。そして、クライアント側では、同じものを使用してJSON文字列をサードパーティのクラスオブジェクトに戻しました。

ここからjarをダウンロードできます:https ://jar-download.com/artifacts/com.google.code.gson/gson/2.8.2/source-code !

これが私がそれをした方法です:

// Method that returns String through a Object as a parameter i.e to be converted

 public static String  generateJSONStringFromObject(ThirdPartyClass object) throws JsonProcessingException{
            ObjectMapper mapper = new ObjectMapper();
            mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
            String jsonString = mapper.writeValueAsString(object);
            
                return jsonString;
        }

// Method that returns Object through a String as a parameter 

 public static ThirdPartyClass generateObjectFromJSONString(String jsonString){
            Gson gson = new Gson();
            ThirdPartyClass thirdPartyClassObject = gson.fromJson(jsonString, ThirdPartyClass.class);
            return thirdPartyClassObject;
        }

于 2021-03-19T12:53:44.433 に答える