Avatar billede myplacedk Nybegynder
21. maj 2004 - 16:58 Der er 6 kommentarer og
1 løsning

Test af serialize

Jeg roder med noget serialization der driller. Det ville være en stor hjælp for mig, hvis jeg kunne teste på en nem måde.

Jeg vil gerne kunne serialize et objekt, deserialize det, og så lave nogle sammenligninger af de to objekter. Men hvordor (de)serialiserer jeg på en nem og simpel måde?

Jeg bruger junit til mine tests, så hvis du har et trick til at teste serialization i junit, ville det være helt perfekt.
Avatar billede arne_v Ekspert
21. maj 2004 - 17:07 #1
Det er ikke så svært - se på encode og decode metoderne i denne her:

import java.util.*;
import java.io.*;
import java.net.*;

public class SerializeToString {
    public static void main(String[] args) throws Exception {
        Vector v = new Vector();
        v.add(0,new Integer(123));
        v.add(1,new String("abc"));
        String s = encode(v);
        Vector v2 = (Vector)decode(s);
        System.out.println((Integer)v2.get(0));
        System.out.println((String)v2.get(1));
    }
    private static String encode(Object o) throws Exception {
        ByteArrayOutputStream ba = new ByteArrayOutputStream(1000);
        ObjectOutputStream oba = new ObjectOutputStream(ba);
        oba.writeObject(o);
        return hexify(ba.toByteArray());
    }
    private static Object decode(String s) throws Exception {
        ByteArrayInputStream ba = new ByteArrayInputStream(dehexify(s));
        ObjectInputStream oba = new ObjectInputStream(ba);
        return oba.readObject();
    }
    private final static String hexValue[] = { "0", "1", "2", "3",
        "4", "5", "6", "7",
        "8", "9", "A", "B",
        "C", "D", "E", "F"};
    private static String hexify(byte[] ba) {
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < ba.length; i++) {
          sb.append(hexValue[(ba[i] >> 4) & 0x0F]);
          sb.append(hexValue[ba[i] & 0x0F]);
        }
        return sb.toString();
    }
    private static byte[] dehexify(String s) {
        int l = s.length() / 2;
        byte[] res = new byte[l];
        for(int i = 0; i < l; i++) {
          res[i] = (byte)Integer.parseInt(s.substring(2*i, 2*i+2), 16);
        }
        return res;
    }
}
Avatar billede arne_v Ekspert
21. maj 2004 - 17:09 #2
hexify & dehexify er naturligvis optional - uden dem er serialiseret form
byte[] og ikke String.
Avatar billede arne_v Ekspert
21. maj 2004 - 17:10 #3
Et andet sjovt stykke kode jeg har liggende på lager:

import java.util.*;
import java.beans.*;
import java.io.*;

public class SerTest implements Serializable {
    public int a;
    private int b;
    private transient int c;
    private HashMap hm1;
    private HashMap hm2;
    public SerTest() {
        a = 0;
        b = 0;
        c = 0;
        hm1 = new HashMap();
        hm2 = new HashMap();
    }
    public SerTest(int a, int b, int c, String v) {
        this.a = a;
        this.b = b;
        this.c = c;
        hm1 = new HashMap();
        hm2 = new HashMap();
        hm1.put("k1", v);
        hm2.put("k2", v);
    }
    public int getB() {
        return b;
    }
    public int getC() {
        return c;
    }
    public HashMap getHm1() {
        return hm1;
    }
    public void setB(int b) {
        this.b = b;
    }
    public void setC(int c) {
        this.c = c;
    }
    public void setHm1(HashMap hm1) {
        this.hm1 = hm1;
    }
    public String toString() {
        return (a + " " + b + " " + c + " " + hm1 + " " + hm2);
    }
    public static void main(String[] args) throws Exception {
        SerTest st1 = new SerTest(1, 2, 3, "V");
        XMLEncoder xe = new XMLEncoder(new FileOutputStream("C:\\xml.dat"));
        xe.writeObject(st1);
        xe.close();
        XMLDecoder xd = new XMLDecoder(new FileInputStream("C:\\xml.dat"));
        SerTest st2 = (SerTest)xd.readObject();
        System.out.println(st1 + " -> " + st2);
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\bin.dat"));
        oos.writeObject(st1);
        oos.close();
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\bin.dat"));
        SerTest st3 = (SerTest)ois.readObject();
        System.out.println(st1 + " -> " + st3);
    }
}
Avatar billede myplacedk Nybegynder
21. maj 2004 - 17:26 #4
Hvis jeg nu forkorter det til:

    private static Object encodedecode(Object o)
        throws IOException, ClassNotFoundException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream(1000);
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(o);
        byte[] bytes = baos.toByteArray();
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        ObjectInputStream ois = new ObjectInputStream(bais);
        return ois.readObject();
    }

Ville det objekt jeg får ud, så ikke være magen til det objekt man ville få, hvis jeg havde sendt gennem netværk el. lign.?
Avatar billede arne_v Ekspert
21. maj 2004 - 17:30 #5
Jo.

Med de kendte undtagelser såsom transient fields etc..
Avatar billede myplacedk Nybegynder
21. maj 2004 - 18:54 #6
Tak. :)
Læg lige et svar...
Avatar billede arne_v Ekspert
21. maj 2004 - 18:58 #7
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester