Permalänk
Medlem

Några tanka om Java Map?

Hej

Sitter och har ett lite problem som jag ej kunnat hitta någon lösning på, så tänkte om det fanns någon därute som har en bättre idé för mina fungerar inte i praktiken.
Mitt problem gäller Javas Map. Detta är verkligen ett smidigt interface och jag har byggt ett rätt stort system runt detta, där all kommunikation mellan olika delsystem kommunicerar med Maps. Detta sker genom att serializera en map, översätta detta till en byte array som jag sedan skickar och där mottagaren översätter tillbaka och skapar mappen igen.
Detta fungerar klockrent och blir väldigt smidigt då jag aldrig behöver veta i vilken ordning allt ligger i mappen då jag bara kan söka på en nyckel och hitta värdet.

Nu till mitt problem:
När man serializerar en mapp så blir denna väldigt mycket större än den ser ut i verkligheten. Så datan jag skickar är betydligt större än själva map strängen.
Nu ska jag byta överföringsmedium som gör att jag måste få ner storleken avsevärt!
Har haft funderingar på en direkt transformation till en byte array men då tappar jag ju hela map strukturen.

Ett exempel är denna map:

{MSG2S=222323, Name=Din mamma, SellerCertificate=Certificate}
Denna map blir 61 byte ifall om man gör en direkt omkastning till en byte array. Om man använder min förra metod med att först serializera och sen göra om till en byte array blir denna istället 236 byte. Alltså en faktor på nästan 4. Denna faktor ökar också snabbt då antalet element ökar.

Så frågan är om någon kan ha en bättre idé om hur jag ska lösa detta?

//Mojo

Permalänk
Medlem

Javas Serialisator är inte direkt känd för att vara utrymmessnål eller effektiv, även fast jag trodde att det hade blivit bättre i senare versioner. Jag har för mig att den bakar in en hel del information (serialVersionUID o.s.v.), förutom objektets egenskaper. Du kan skriva din egen serialisator genom writeObject()- och readObject()-metoder, för att få ner storleken på objektet. Det står lite här: http://java.sun.com/javase/6/docs/api/java/io/Serializable.ht...

Permalänk
Medlem

Hej

Jo detta har jag redan tänkt på och men detta ger mig inte tillräcklig bra utdelning ändå. Jag vill nästan inte få någonting kvar alls

Min serializering av mappen:
{MSG2S=222323, Name=Din mamma, SellerCertificate=Certificate}

Blir denna:
MAP[228]{E[64]<K[24][java.lang.String,MSG2S]=>V[26][java.lang.Integer,222323]>,E[65]<K[23][java.lang.String,Name]=>V[28][java.lang.String,Din mamma]>,E[80]<K[36][java.lang.String,SellerCertificate]=>V[30][java.lang.String,Certificate]>}

Som ni ser blir den betudligt större även om jag har en egen serizliser.

Har dock börjat fundera på GZIP? Man kanske kan zippa ner byte arrayen man får ut? Har inte orkat prova ännu och är nu fredag kväll så det får bli en annan dags jobb. Men om någon har någon annan ide så skriv gärna.

//Mojo

Permalänk
Medlem

Går det inte att programmera serialiseringsalgoritmen så att den hanterar värden efter din egen notation {MSG2S=222323, Name=Din mamma, SellerCertificate=Certificate}?

Om du alltid använder Strings så borde det inte vara några problem.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Jo om det bara skulle finnas strängar så hade det inte varit så stora probelm. Dock så innehålelr dessa mappar de allra flesta typer du kan tänka dig samt också map in map så att säga. Jag har inte orkat ta tag i detta ännu då jag känner att jag vill gå igenom alla allternativ först. GZIP är min bästa lösning hittils men då överföringen sker till en telefon så är det J2ME så får bestämma lite vad jag kan göra, och där finns ingen GZIP med i bibloteken. Har dock sett lite olika varianter av öppen källkod för detta som kanske kan passa.

Men som sagt, håller på att tänka igenom detta noggrant innan. Så kom gärna med mera förslag om det nu finns några?

//Mojo

Permalänk
Medlem

Ja, det känns som att serialiseringen inte kan bli mindre eftersom att du vill ha kvar typen på egenskaperna gissar jag på (det är ju ganska fundamentalt ). Så att försöka hitta en serialisator som skapar en mindre output är antagligen kört, då får du vända dig till komprimeringsalgoritmer (som du redan är inne på).

Här är en J2ME-vänlig: http://www.winterwell.com/software/compressor.php
Här är ytterligare en, men den är äldre: http://www.java4ever.com/index.php?section=j2me&project=gzip&...