Zapis do pliku

0

Witam, mam problem z zapisaniem zawartości ArrayList do pliku binarnego. Plik się normalnie tworzy, ale i tak wyskakuje error. Co ciekawe w innym projekcie normalnie mi to działało.
Co tu może crashować? Z góry dzięki za pomoc.

 try {
																						
	 ObjectOutputStream out=new ObjectOutputStream(new    FileOutputStream("plikkkkk"));																             
	 out.writeObject(lista);
	 out.close();
																			            
			  }
				catch(IOException ioe)
				{
					System.out.println("Error!zapisywanie");
				 }

W pliku binarnym jest takie coś jak poniżej, czyli poprawnie się to nie zapisało

 
¬í sr java.util.ArrayListxŇ™Çať I sizexp   w   {sr  java.io.NotSerializableException(Vx ç†5  xr java.io.ObjectStreamExceptiondĂäkŤ9űß  xr java.io.IOExceptionl€sde%đ«  xr java.lang.ExceptionĐý>;Ä  xr java.lang.ThrowableŐĆ5'9w¸Ë L causet Ljava/lang/Throwable;L 
detailMessaget Ljava/lang/String;[ 
stackTracet [Ljava/lang/StackTraceElement;L suppressedExceptionst Ljava/util/List;xpq ~ 	t SĹ‚owour [Ljava.lang.StackTraceElement;F*<<ý"9  xp   2sr java.lang.StackTraceElementa	Ĺš&6Ý… I 
lineNumberL declaringClassq ~ L fileNameq ~ L 
methodNameq ~ xp˙˙˙˙t java.io.ObjectOutputStreampt writeObject0sq ~ 
˙˙˙˙q ~ pt writeObjectsq ~ 
˙˙˙˙t java.util.ArrayListpq ~ sq ~ 
˙˙˙ţt $sun.reflect.NativeMethodAccessorImplpt invoke0sq ~ 
˙˙˙˙q ~ pt invokesq ~ 
˙˙˙˙t (sun.reflect.DelegatingMethodAccessorImplpq ~ sq ~ 
˙˙˙˙t java.lang.reflect.Methodpq ~ sq ~ 
˙˙˙˙t java.io.ObjectStreamClasspt invokeWriteObjectsq ~ 
˙˙˙˙q ~ pt writeSerialDatasq ~ 
˙˙˙˙q ~ pt writeOrdinaryObjectsq ~ 
˙˙˙˙q ~ pq ~ sq ~ 
˙˙˙˙q ~ pq ~ sq ~ 
  Ůt GUIt GUI.javat zapiszsq ~ 
  qq ~ (q ~ )t actionPerformedsq ~ 
˙˙˙˙t javax.swing.AbstractButtonpt fireActionPerformedsq ~ 
˙˙˙˙t "javax.swing.AbstractButton$Handlerpq ~ ,sq ~ 
˙˙˙˙t javax.swing.DefaultButtonModelpq ~ /sq ~ 
˙˙˙˙q ~ 3pt 
setPressedsq ~ 
˙˙˙˙t *javax.swing.plaf.basic.BasicButtonListenerpt 
mouseReleasedsq ~ 
˙˙˙˙t java.awt.Componentpt processMouseEventsq ~ 
˙˙˙˙t javax.swing.JComponentpq ~ ;sq ~ 
˙˙˙˙q ~ :pt processEventsq ~ 
˙˙˙˙t java.awt.Containerpq ~ ?sq ~ 
˙˙˙˙q ~ :pt dispatchEventImplsq ~ 
˙˙˙˙q ~ Apq ~ Csq ~ 
˙˙˙˙q ~ :pt 
dispatchEventsq ~ 
˙˙˙˙t java.awt.LightweightDispatcherpt retargetMouseEventsq ~ 
˙˙˙˙q ~ Hpq ~ ;sq ~ 
˙˙˙˙q ~ Hpq ~ Fsq ~ 
˙˙˙˙q ~ Apq ~ Csq ~ 
˙˙˙˙t java.awt.Windowpq ~ Csq ~ 
˙˙˙˙q ~ :pq ~ Fsq ~ 
˙˙˙˙t java.awt.EventQueuepq ~ Csq ~ 
˙˙˙˙q ~ Qpt 
access$500sq ~ 
˙˙˙˙t java.awt.EventQueue$3pt runsq ~ 
˙˙˙˙q ~ Upq ~ Vsq ~ 
˙˙˙ţt java.security.AccessControllerpt doPrivilegedsq ~ 
˙˙˙˙t 5java.security.ProtectionDomain$JavaSecurityAccessImplpt doIntersectionPrivilegesq ~ 
˙˙˙˙q ~ \pq ~ ]sq ~ 
˙˙˙˙t java.awt.EventQueue$4pq ~ Vsq ~ 
˙˙˙˙q ~ `pq ~ Vsq ~ 
˙˙˙ţq ~ Ypq ~ Zsq ~ 
˙˙˙˙q ~ \pq ~ ]sq ~ 
˙˙˙˙q ~ Qpq ~ Fsq ~ 
˙˙˙˙t java.awt.EventDispatchThreadpt pumpOneEventForFilterssq ~ 
˙˙˙˙q ~ fpt pumpEventsForFiltersq ~ 
˙˙˙˙q ~ fpt pumpEventsForHierarchysq ~ 
˙˙˙˙q ~ fpt 
pumpEventssq ~ 
˙˙˙˙q ~ fpq ~ msq ~ 
˙˙˙˙q ~ fpq ~ Vsr &java.util.Collections$UnmodifiableListü%1µěŽ L listq ~ xr ,java.util.Collections$UnmodifiableCollectionB €Ë^÷ L ct Ljava/util/Collection;xpsr java.util.ArrayListxŇ™Çať I sizexp    w    xq ~ ux
0

Wygląda to tak, jakby przyczyna erroru była w wierszu:
out.writeObject(lista);

bo gdy wstawię System.out.print przed nim, to normlanie się wyświetla, natomiast gdy jest System.out.print po tym wierszu, to już nie.

0

Po pierwsze formatowanie tego posta woła o pomstę do nieba, nic kompletnie nie widzę.
Po drugie korzystasz z ObjectOutputStream, który nie zapisuje tego tak jak byś chciał.
Korzystając z ObjectOutputStream i używając ArrayList musisz mieć pewność, że wszystkie obiekty znajdujące się w liście implementują interfejs Serializable.
Bardzo ładnie Ci to pokazało w pliku

java.io.NotSerializableException

w pierwszej linii.
Co chcesz tam zapisać?

0

Chcę zapisać listę ArrayList, w której są elementy (obiekty) stworzonej przeze mnie klasy.

Ok dzięki za porady. W wcześniejszym projekcie jakimś cudem mi to działało, więc myslalem, że to prawidłowy sposób.

Czyli serializacja ( o kórej muszę poczytać, bo nic nie wiem) + ten mój sposób, tak?

0

Tu znalazłem taki oto przykład. Pamiętaj, aby Twoja klasa implementowała interfejs Serializable ;)

1

Generalnie odradzam takie (de)serializacje. Są zależne od wersji, bardzo niebezpieczne jeśli ładujesz niezaufane dane (patrz np. https://github.com/p4-team/ctf/tree/master/2016-08-21-bioterra-ctf/akashic_records#pl-version ) i to wszystko jest mega nieczytelne. Zalecałbym użyć np. JAXB albo Jacksona i serializować to jako XML albo JSON.

1 użytkowników online, w tym zalogowanych: 0, gości: 1