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.
Annonceindlæg tema
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; } }
hexify & dehexify er naturligvis optional - uden dem er serialiseret form byte[] og ikke String.
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); } }
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.?
Jo. Med de kendte undtagelser såsom transient fields etc..
Tak. :) Læg lige et svar...
Kurser inden for grundlæggende programmering