<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="hu">
	<id>https://vik.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lucz+Tam%C3%A1s+Soma</id>
	<title>VIK Wiki - Felhasználó közreműködései [hu]</title>
	<link rel="self" type="application/atom+xml" href="https://vik.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lucz+Tam%C3%A1s+Soma"/>
	<link rel="alternate" type="text/html" href="https://vik.wiki/Speci%C3%A1lis:Szerkeszt%C5%91_k%C3%B6zrem%C5%B1k%C3%B6d%C3%A9sei/Lucz_Tam%C3%A1s_Soma"/>
	<updated>2026-04-05T12:34:58Z</updated>
	<subtitle>Felhasználó közreműködései</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://vik.wiki/index.php?title=Szerializalas_jegyzet&amp;diff=189879</id>
		<title>Szerializalas jegyzet</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Szerializalas_jegyzet&amp;diff=189879"/>
		<updated>2016-06-13T20:07:47Z</updated>

		<summary type="html">&lt;p&gt;Lucz Tamás Soma: /* Korábbi vizsgapéldák */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Jelen jegyzet, leírás, segédlet nevezzük bárhogy megpróbálja az Objektumorientált Szoftvertervezés és Szoftvertechnológia tárgyakban előszeretettel kérdezett Java szerializálás témaköréből egy áttekinthető, konyhanyelven készült leírást szolgáltatni, sok-sok példával.&lt;br /&gt;
== Alapok, amiket jó ha tudunk ==&lt;br /&gt;
* Alapvetően minden nem statikus és nem tranzies attribútuma egy osztálynak szerializálódik, amely megvalósítja a Serializable interfészt.&lt;br /&gt;
* A láthatóság nem befolyásolja a szerializálhatóságot, mind a public, protected és private adattagok szerializálódnak.&lt;br /&gt;
* Kiíráskor minden objektum egyszer íródok ki &amp;quot;rendesen&amp;quot;, azt követően az adott objektum újboli kiírásakor - feltételezve, hogy a streamet nem zárták be - csupán egy referencia kerül kiírásra, amely referál az először kiírt &amp;quot;rendes&amp;quot; objektumra.&lt;br /&gt;
* A szerializálhatóság mint tulajdonság, fennmarad az örökléskor is, tehát ha egy osztály sorosítható akkor annak leszármazottai is kimenthetőek lesznek.&lt;br /&gt;
*A szerializálás tiltására van lehetőségünk, a wirteObject metódust kell felüldefiniálnunk abban az osztályban, amelyiket nem szeretnénk szerializálni:&lt;br /&gt;
   private void writeObject(ObjectOutputStream o) throws NotSerializableException{&lt;br /&gt;
      throw new NotSerializableException(&amp;quot;No-no! No Mr. Serializaton!&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* Két nagyon fontos metódus játszik fő szerepet a szerializálásban:&lt;br /&gt;
**private void &#039;&#039;&#039;writeObject&#039;&#039;&#039; (ObjectOutputStream out) throws IOException&lt;br /&gt;
***A metódus gyakorlatilag teljes kontrollt biztosít a szerializálandó objektum sorosítása felett. A legtöbb esetben egy out.defaultWriteObject() metódushívással kezdődik ezen metódusok implementálása, majd ezt követően lehetőségünk van egyéb adatok sorosítására az erre alkalmas metódusok meghívásával mint pl. az out.writeDouble.&lt;br /&gt;
**private void &#039;&#039;&#039;readObject&#039;&#039;&#039;(ObjectInputStream in) throws IOException, ClassNotFoundException&lt;br /&gt;
***A writeObject metódus ellentéte, a korábban szerializált obejktumokat ezzel a metódussal tudjuk beolvasni. Felüldefiniálásakor az implementáció itt is - a writeObject-hez hasonlóan - az automatikusan szerializált adatok automatikus visszaolvasásával kezdődik, ami a in.defaultReadObject() meghívásával történik. Ezek után beolvassuk azon extra adatokat amelyeket korábban a writeObject() metódussal szerializáltunk. Fontos, hogy a típusegyezésre nekünk kell figyelnünk, így beolvasáskor helyesen kell kasztolnunk, illetve a primitív típusok esetén a megfelelő beolvasó metódust kell meghívnunk.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Egy, két nyalánkság:&#039;&#039;&#039;&lt;br /&gt;
**private Object &#039;&#039;&#039;writeReplace&#039;&#039;&#039;() throws ObjectStreamException&lt;br /&gt;
***A metódus segítségével létrehozható egy &amp;quot;helyettesítő&amp;quot; objektum. A szerializálás során ez az újonnan létrehozott objektum fog szerializálódni az eredeti helyett.&lt;br /&gt;
***Az ObjectOuputStream ellenőrzi, hogy a sorosítani kívánt osztály definiál-e writeReplace() metódust, és ha igen meghívja azt először majd az így visszaadott objektumot fogja végül sorosítani.&lt;br /&gt;
**private Object &#039;&#039;&#039;readResolve&#039;&#039;&#039;() throws ObjectStreamException&lt;br /&gt;
***A writeReplace() ellentéte. Ha a metódus definiált az osztályban, akkor az objektum beolvasása előtt, ennek a metódusnak az eredményét &amp;quot;olvassa be&amp;quot; az ObjectInputStream, a korábban szerializált helyett.&lt;br /&gt;
**private static final ObjectStreamField[] &#039;&#039;&#039;serialPersistentFields&#039;&#039;&#039;&lt;br /&gt;
***Fontos, hogy ez a korábbiakkal ellentétben nem metódus, hanem egy statikus, nem módosítható tömb az osztályban.&lt;br /&gt;
***A tömb használatával lehetőségünk van explicit megadni, hogy az osztály mely attribútumai szerializálódjanak. &#039;&#039;&#039;Fontos&#039;&#039;&#039;, hogy csak a tömbben megjelölt tagváltozók mentődnek ki, tehát hiába van az osztálynak több nem statikus és nem tranziens tagváltozója, csak és kizárólag azon attribútumok fognak szerializálódni amelyek ebben a tömbben szerepelnek!&lt;br /&gt;
***A lenti példában beállítottuk, hogy a Dog osztály szerializálásakor csak az age és a name attribútumok mentődjenek le, a többi adat ne. &#039;&#039;&#039;Fontos, hogy a tranziensnek jelölt attribútumok is szerializálhatók így!&#039;&#039;&#039;&lt;br /&gt;
   public class Dog implements Serializable {&lt;br /&gt;
      public String name;&lt;br /&gt;
      public int age;&lt;br /&gt;
      private int ID;&lt;br /&gt;
      private String owner;&lt;br /&gt;
      &lt;br /&gt;
      private static final ObjectStreamField[] serialPersistentFields = { &lt;br /&gt;
            new ObjectStreamField(&amp;quot;age&amp;quot;,Integer.TYPE), &lt;br /&gt;
            new ObjectStreamField(&amp;quot;name&amp;quot;, String.TYPE) };&lt;br /&gt;
       &lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Korábbi vizsgapéldák ==&lt;br /&gt;
=== OOT - 2015. június 2. ===&lt;br /&gt;
   public class A implements Serializable {&lt;br /&gt;
      private int x = 1;&lt;br /&gt;
      public transient int y = 2;&lt;br /&gt;
      &lt;br /&gt;
      private static final ObjectStreamField[] serialPersistentFields = { new ObjectStreamField(&amp;quot;y&amp;quot;, Integer.TYPE) };&lt;br /&gt;
      &lt;br /&gt;
      public A() { x = 3; y = 4; }&lt;br /&gt;
      &lt;br /&gt;
      public Object writeReplace() throws ObjectStreamException {&lt;br /&gt;
            A a = new A(); a.x = 5; a.y = 6; return a;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
* Eredmény: x = 0, y = 6&lt;br /&gt;
&lt;br /&gt;
=== OOT - 2015. június 9. ===&lt;br /&gt;
   public class A implements Serializable {&lt;br /&gt;
      &lt;br /&gt;
      private transient int x = 8;&lt;br /&gt;
      public int y = 4;&lt;br /&gt;
      &lt;br /&gt;
      public A () { x = 0; y = 4; }&lt;br /&gt;
      &lt;br /&gt;
      private static final ObjectStreamField[] serialPersistentFields = { new ObjectStreamField(&amp;quot;x&amp;quot;, Integer.TYPE) };&lt;br /&gt;
      &lt;br /&gt;
      private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{&lt;br /&gt;
         in.defaultReadObject();&lt;br /&gt;
         x = y + 4;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
* Eredmény: x=4, y=0&lt;br /&gt;
* [[:File:oot_20150602VizsgaFeladat_20150612.java | Java fájl letöltése]]&lt;/div&gt;</summary>
		<author><name>Lucz Tamás Soma</name></author>
	</entry>
</feed>