WriteObject neden java.io.NotSerializableException atıyor ve bunu nasıl düzeltebilirim?


110

Bu istisnaya sahibim ve neden fırlatılacağını ya da bununla nasıl başa çıkmam gerektiğini anlamıyorum.

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

Burada elementbir olan TransformGroupbaşka içeren TransformGroupssınıf atomlu bir örneği:

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);
    }
}

Tam hata günlüğü:

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 sınıfında), Görünümü genişleten özel bir sınıftır.


4
Görünüşe göre javax.media.j3d.TransformGroupkendisi Serializable'ı uygulamıyor
micha

Neden Atomhem genişler Grouphem de bir Groupüye var?
Lorne Markisi

Yanıtlar:


210

Nesnenizin alanları sırayla kendi alanlarına sahiptir ve bunların bazıları uygulanmaz Serializable. Sizin durumunuzda rahatsız edici sınıf TransformGroup. Nasıl çözeceksin?

  • ders seninse, yap Serializable
  • sınıf 3. tarafsa, ancak serileştirilmiş formda ihtiyacınız yoksa, alanı şu şekilde işaretleyin: transient
  • Verilerine ihtiyacınız varsa ve üçüncü tarafsa, tanımlarını değiştirmeden 3. taraf nesnelerini serileştirebileceğiniz JSON, XML, BSON, MessagePack vb. gibi diğer serileştirme yöntemlerini düşünün .

2
Pekala, çok teşekkürler, bunu yapmak oldukça zor olacak çünkü benim nesnelerim sadece TransformGroup'un bir parçası olarak var ve onları saklayan herhangi bir değişken yok. Uygulamam bir 3B molekül oluşturucu ve tüm atomlarım ve sınırlarım sadece örnek olarak TransformGroup'a ekleniyor - örneğin (yeni Atom ()). Sorun sadece onların bir dosyaya yazılmasına ihtiyacım olmaması değil, aynı zamanda kullanıcının mevcut nesneleri kaldırmak veya düzenlemek isteyebilmesidir. Sanırım XML tabanlı serileştirmeyi deneyeceğim, ancak bu konseptte oldukça yeniyim ve bu benim için henüz biraz zor. Teşekkürler
Mihai Bujanca

15
Bu mükemmel yanıta eklemek için: Verilerine ve üçüncü tarafa ihtiyacınız varsa, üçüncü taraf sınıfını, üçüncü taraf sınıfının verilerini uygulayan Serializableve kullanan readObject()ve writeObject()manuel olarak seri hale getiren kendi sınıfınıza sarmak isteyebilirsiniz . Bazı durumlarda bu makul bir yaklaşım olabilir. stackoverflow.com/a/12963580/1208581
sulai

76

java.io.NotSerializableExceptionbir iç sınıf örneğini serileştirdiğinizde ortaya çıkabilir, çünkü:

Böyle bir iç sınıf örneğinin serileştirilmesi, ilişkili dış sınıf örneğinin de serileştirilmesine neden olur

Yerel ve anonim sınıflar dahil olmak üzere iç sınıfların serileştirilmesi (yani, statik üye sınıflar olmayan iç içe geçmiş sınıflar) kesinlikle önerilmez

Ref: Serileştirilebilir Arayüz


5
Bu benim için böyleydi. Bir birim testinde kısa bir yol çizdiğimde oluyordu. Umarım bu cevap bir başkasına biraz zaman kazandırır.
user489041

Özel bir alanım vardı final Set <ClaimsNode> giden = new TreeSet <ClaimsNode> (new Comparator <ClaimsNode> () {public int Compare (ClaimsNode o1, ClaimsNode o2) {return o1.getNativeIndex () - o2.getNativeIndex (); }});
Vitaly Sazanovich

1
Şaşırtıcı, Kelimenin tam anlamıyla son 1 saattir bunun içindeydim. İlkel girişlerin bile serileştirilebilir olmadığından şüphe etmeye başladım ve sonra aklıma geldi, belki de burada gerçekten bir şeyler yanlış.
Shivam Pokhriyal

13

Arabirimi uygulayarak sınıfı serileştirilebilir hale getirin java.io.Serializable.

  • java.io.Serializable - İçinde herhangi bir yöntem bulunmayan Marker Arayüzü.
  • İşaretleyici Arayüzünün Amacı - ObjectOutputStreambu nesnenin serileştirilebilir bir nesne olduğunu söylemek .

7
Zaten Serializable uygulayan soruyu okuyabilirsiniz. Hala 12+ beni şaşırtıyor.
shaILU
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.