[Java] Zelf objecten (de)serializen

Pagina: 1
Acties:

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20-05 20:29

Robtimus

me Robtimus no like you

Topicstarter
Ik moet zelf objecten naar byte[] converteren en terug*, en dat lukt me wel, maar wel met de creatie van 2 streams per keer:
Java:
1
2
3
4
ByteArrayOutputStream bout = new ByteArrayOutputStream(); // evt size opgeven
ObjectOutputStream out = new ObjectOutputStream(bout);
out.writeObject(o);
return bout.toByteArray();
Java:
1
2
3
ByteArrayInputStream bin = new ByteArrayInputStream(bytes); // evt met offset en length
ObjectInputStream in = new ObjectInputStream(bin);
return in.readObject();
Het punt is alleen dat ik nu het liefst streams ga hergebruiken. Gewoon weer in out schrijven werkt niet want die bytes worden geappend, en terugconverteren levert dan steeds het eerste object op.

Ik heb al aardig geexperimenteerd met resetten van de streams, maar dan raakt de data in de byte[]s corrupt zodra je het terug wil converteren naar een object. Flushen ook al geprobeerd maar dat haalt niets uit in dit geval.

Weet iemand een manier om dit voor elkaar te krijgen zonder elke keer weer 2 streams te creeren?

* bv om ze via UDP / DataGrams te versturen.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik denk dat je niet zo bang moet zijn voor die 2 streams. Java streams zijn juist ontworpen om zo aan elkaar geschakeld te worden.

[edit]
Of bedoel je de in stream.. en de out stream??

[ Voor 19% gewijzigd door Alarmnummer op 29-10-2004 22:46 ]


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 20-05 22:22
Het flushen van de ObjectOutputStream zou toch moeten werken?
Wat raar.

Edit: heb nog even wat gezocht in de sun docs:

http://java.sun.com/docs/...ntial/io/serializing.html

[ Voor 55% gewijzigd door Kwistnix op 29-10-2004 22:58 ]


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

Je kan toch ook de speciale methodes voor het custom (de)serializen van objecten zelf implementeren? Of wil je helemaal iets anders:
Java:
1
2
3
4
 private void writeObject(java.io.ObjectOutputStream out)
     throws IOException
 private void readObject(java.io.ObjectInputStream in)
     throws IOException, ClassNotFoundException;

"Beauty is the ultimate defence against complexity." David Gelernter


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20-05 20:29

Robtimus

me Robtimus no like you

Topicstarter
Alarmnummer schreef op 29 oktober 2004 @ 22:45:
Ik denk dat je niet zo bang moet zijn voor die 2 streams. Java streams zijn juist ontworpen om zo aan elkaar geschakeld te worden.
De manier van creeeren is het probleem niet, het probleem is dat ik voor elke conversieslag 3 objecten creeer (2 streams + array/object). Aangezien ik erg veel moet converteren in high priority threads krijgt de garbage collector de tijd niet om op tijd objecten op te ruimen. Resultaat: OutOfMemoryError. Meer geheugen toewijzen aan de VM verschuift het probleem alleen maar.
[edit]
Of bedoel je de in stream.. en de out stream??
Die zijn al goed gescheiden van elkaar, het gaat erom dat ik streams wil hergebruiken.
FallenAngel666 schreef op 29 oktober 2004 @ 22:54:
Het flushen van de ObjectOutputStream zou toch moeten werken?
Wat raar.

Edit: heb nog even wat gezocht in de sun docs:

http://java.sun.com/docs/...ntial/io/serializing.html
De combinatie met de ByteArray streams geeft het probleem; alle data wordt, ondanks flushes, gewoon geappend in het onderliggende array van de ByteArrayOutputStream. Een reset op die stream verwijderd headers oid, want HET array raakt dan ongeschikt voor terugconverteren.

Met bijna elke andere onderliggende streams gaat het goed, alleen niet met de ByteArray streams.
Macros schreef op 29 oktober 2004 @ 23:50:
Je kan toch ook de speciale methodes voor het custom (de)serializen van objecten zelf implementeren? Of wil je helemaal iets anders:
Java:
1
2
3
4
 private void writeObject(java.io.ObjectOutputStream out)
     throws IOException
 private void readObject(java.io.ObjectInputStream in)
     throws IOException, ClassNotFoundException;
De objecten die moeten worden geconverteerd worden ook aangeleverd, daar heb ik dus geen controle over. Bovendien werkt de standaard serialisatie wel, alleen ik wil het aantal streams dat per conversieslag moet worden gecreeerd minimaliseren. Eenmalig creeren in de constructor en dan hergebruiken is ideaal. Alleen dat krijg ik niet voor elkaar.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

IceManX schreef op 30 oktober 2004 @ 13:15:
Die zijn al goed gescheiden van elkaar, het gaat erom dat ik streams wil hergebruiken.
Dat was me al duidelijk. Maar ik dacht dat je streams in de chain wou gaan hergebruiken en dat is dus niet noodzakelijk. Maar dat was je vraag ook niet.. jij wil je in en out stream dus hergebruiken.

Check verder eens:
http://javolution.org

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20-05 20:29

Robtimus

me Robtimus no like you

Topicstarter
Ziet er veelbelovend uit, zelfs meer dan jRate die ik tot nu toe gebruikte :)

Helaas loopt mijn project zelf dinsdag al af, dus aanpassen gaat niet meer. Jammer dat ik dit niet eerder had gevonden zeg. Want op de stack creeren van objecten lost nou net het probleem op...

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

IceManX schreef op 30 oktober 2004 @ 13:34:
Ziet er veelbelovend uit, zelfs meer dan jRate die ik tot nu toe gebruikte :)

Helaas loopt mijn project zelf dinsdag al af, dus aanpassen gaat niet meer. Jammer dat ik dit niet eerder had gevonden zeg. Want op de stack creeren van objecten lost nou net het probleem op...
Het is echt super eenvoudig hoor om objecten op de stack te maken ipv op de heap. Check de javadoc maar. In principe kan je het er in 5 minuten in hebben zitten.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20-05 20:29

Robtimus

me Robtimus no like you

Topicstarter
Helaas kan ik maandag pas weer bij de code, en dan heb ik het druk zat met mijn verslag dat dan afmoet.
Deze vraag was ook meer bedoeld voor future work.

Iig hardstukke bedankt :)

[ Voor 17% gewijzigd door Robtimus op 30-10-2004 13:40 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-05 06:45
Hoe doen ze dat in godsnaam met alleen Java VM code? Zijn er dan Java VM instructies om objecten op te stak te alloceren, of hoe zit dat?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Soultaker schreef op 30 oktober 2004 @ 13:54:
Hoe doen ze dat in godsnaam met alleen Java VM code? Zijn er dan Java VM instructies om objecten op te stak te alloceren, of hoe zit dat?
Ik geloof dat het een kwestie van al-dan-niet een object uit een functie terug laten komen is?

[edit]
Toch niet, anyway in de javadocs wordt wel het een en ander uitgelegd.

[ Voor 83% gewijzigd door ACM op 30-10-2004 16:09 ]

Pagina: 1