26. april 2003 - 12:58
Der er
12 kommentarer og 1 løsning
Har noen et enkelt eksempel på object serialization
hei, trenger et helt grunnleggende eksempel på object serialization. Gjerne der det brukes for kommunikasjon mellom en HttpServlet og en applet.
Annonceindlæg fra DE-CIX
26. april 2003 - 13:10
#1
Her er et eksempel på en klasse der serialiserer objekter: import java.io.*; public class Serialisering { public static void gem(Object obj, String filnavn) { try { FileOutputStream datastrøm = new FileOutputStream(filnavn); ObjectOutputStream objektstrøm = new ObjectOutputStream(datastrøm); objektstrøm.writeObject(obj); objektstrøm.close(); } catch (Exception e) { System.out.println("Fejl: "+e); } } public static Object hent(String filnavn) throws Exception { FileInputStream datastrøm = new FileInputStream(filnavn); ObjectInputStream objektstrøm = new ObjectInputStream(datastrøm); Object obj = objektstrøm.readObject(); objektstrøm.close(); return obj; } }
26. april 2003 - 13:12
#2
Husk blot at implementere Serializable, hvis det er et objekt af en klasse du skal lave.
26. april 2003 - 13:15
#3
Jeg tror at du kan bruge dette her til noget: 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; } }
26. april 2003 - 13:23
#4
ehh... ja.. Dette viser da lidt om serialization!! ;-) Forhåbentligt. import java.io.*; public class MyObject implements Serializable { String _stuff; /* empty constructor needed for serialization */ public MyObject() { } public String getStuff() { return _stuff; } public void setStuff(String s) { _stuff = s; } public static void main(String[] args) { final String INPUT_FILENAME = "myobject.ser"; if (args.length == 1 && "write".equalsIgnoreCase(args[0])) { ObjectOutputStream oos = null; try { MyObject obj = new MyObject(); obj.setStuff("This is merely a test"); oos = new ObjectOutputStream( new FileOutputStream(INPUT_FILENAME)); oos.writeObject(obj); } catch (Exception e) { e.printStackTrace(); } finally { if (oos != null) { try { oos.close(); } catch (Exception e) { e.printStackTrace(); } } } } else if (args.length == 1 && "read".equalsIgnoreCase(args[0])) { ObjectInputStream ois = null; try { ois = new ObjectInputStream(new FileInputStream(INPUT_FILENAME)); MyObject obj = (MyObject) ois.readObject(); System.out.println("Stuff string is : "+obj.getStuff()); } catch (Exception e) { e.printStackTrace(); } finally { if (ois != null) { try { ois.close(); } catch (Exception e) { e.printStackTrace(); } } } } else { System.out.println("java MyObject <write|read> (eg. java MyObject write"); } } }
26. april 2003 - 13:28
#5
Gir ingen poeng ennå, er det mulig at dere forklarer litt nærmere da jeg er helt fersk. Trenger info om hva som skal tilhøre appleten, hva som tilhører servlet'en og hva jeg må kalle fra appleten for å få returnert objekt fra servlet, og motsatt.
26. april 2003 - 13:32
#6
I mit eksempel skal du have klassen med de to metoder encode og decode i både appletten og servletten. (du kan slette maim - de er kun for test) Når appletten så skal sende et objekt, så kalder den encode og sender strengen i en HTTP request. Servletten bruger decode til at få objektet ud af strengen igen. Hvis der skal et objekt tilbage, så kalder servletten encode og sender strengen tilbage og appletten bruger så decode til at få fat i objektet.
26. april 2003 - 13:33
#7
(du bruger HttpURLConnection til at sende fra applet til servlet, men det regner jeg med at du har styr på)
26. april 2003 - 13:34
#8
via RMI sender du bare serializable objekter frem og tilbage som ønsket. HUSK det skal være samme version af objekterne (samme serialVersionUID). Men hvis du bruger den samme klasse fil .class på på server(servlet) siden og klienten (appletten) er der ingen problemer..
26. april 2003 - 13:35
#9
upps.. Ikke samme version af objekterne men samme version af KLASSERNE ;-) Typisk vil du jo downloade applet'en fra samme server (http server) og derfor ligger klassen jo på serveren og det er nemmere at styre..
26. april 2003 - 13:36
#10
RMI til servlet ???? Det lyder lidt "utraditionelt" !
26. april 2003 - 13:45
#11
ja okay ;-) Men ved brug af HTTPURLConnection skal man huske at lave et POST request, hvis man vil have bin lign. data igennem.
26. april 2003 - 13:48
#12
Korrekt. Men min encode hexifier det serialiserede, så det bliver til tekst.
26. april 2003 - 13:51
#13
For at kunne lave GET lign. request?? Bare objekterne ikke bliver for store for mange HTTP servere modtager ikke HTTP protokol headere over 4k eller der omkring, så du kan risikere at miste data såfremt at GET strengen bliver for lang. Nevertheless , en god løsning.. ;-)
Kurser inden for grundlæggende programmering