Avatar billede jally72 Nybegynder
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.
Avatar billede mikkelbm Nybegynder
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;
  }
}
Avatar billede mikkelbm Nybegynder
26. april 2003 - 13:12 #2
Husk blot at implementere Serializable, hvis det er et objekt af en klasse du skal lave.
Avatar billede arne_v Ekspert
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;
    }
}
Avatar billede lborupj Nybegynder
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");
        }
    }
}
Avatar billede jally72 Nybegynder
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.
Avatar billede arne_v Ekspert
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.
Avatar billede arne_v Ekspert
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å)
Avatar billede lborupj Nybegynder
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..
Avatar billede lborupj Nybegynder
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..
Avatar billede arne_v Ekspert
26. april 2003 - 13:36 #10
RMI til servlet ????

Det lyder lidt "utraditionelt" !
Avatar billede lborupj Nybegynder
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.
Avatar billede arne_v Ekspert
26. april 2003 - 13:48 #12
Korrekt.

Men min encode hexifier det serialiserede, så det bliver til tekst.
Avatar billede lborupj Nybegynder
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.. ;-)
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