Avatar billede esset Nybegynder
15. december 2003 - 21:02 Der er 19 kommentarer og
1 løsning

Serialisering af objekter til brug for SOAP

Jeg har en klasse som i en vector skal sendes til en klient via SOAP, men jeg kan ikke umiddelbart få den serialiseret til det. Klassen indeholder samtidigt en vector af objekter af en anden klasse som vel også skal serialiseres ??? Hvordan gør jeg det nemmest ?

public class Disc{

    private String ID;
    private String title;
    private String year;
    private String genre;
    private Vector tracks = new Vector();
   
    public Disc(){
    }
   
    public Disc(String ID, String title) {
        this.setID(ID);
        this.setTitle(title);
    }

    /**
    * @return
    */
    public String getID() {
        return this.ID;
    }

    /**
    * @param string
    */
    public void setID(String ID) {
        this.ID = ID;
    }

    /**
    * @return
    */
    public String getTitle() {
        return this.title;
    }

    /**
    * @param string
    */
    public void setTitle(String title) {
        this.title = title;
    }

    /**
    * @return
    */
    public String getYear() {
        return this.year;
    }

    /**
    * @param string
    */
    public void setYear(String year) {
        this.year = year;
    }

    /**
    * @return
    */
    public String getGenre() {
        return this.genre;
    }

    /**
    * @param string
    */
    public void setGenre(String genre) {
        this.genre = genre;
    }

    /**
    * @return
    */
    public Vector getTracks() {
        return this.tracks;
    }

    /**
    * @param string
    */
    public void addTrack(Track track) {
        this.tracks.addElement(track);
    }

    /**
    * @return
    */
    public int getNoOfTracks() {
        return this.tracks.size();
    }

    /**
    * @return
    */
    public String getTrackName(int position) {
        Track name = (Track) this.tracks.get(position);
        return name.getName();
    }

    /**
    * @return
    */
    public String getTrackLength(int position) {
        Track length = (Track) this.tracks.get(position);
        return length.getName();
    }
}

public class Track{
    private String name;
    private String length;

    public Track(){
    }
   
    public Track(String name){
        this.name = name;
    }
   
    /**
    * @return
    */
    public String getLength() {
        return this.length;
    }

    /**
    * @return
    */
    public String getName() {
        return this.name;
    }

    /**
    * @param string
    */
    public void setLength(String string) {
        this.length = string;
    }

    /**
    * @param string
    */
    public void setName(String string) {
        this.name = string;
    }

}
Avatar billede arne_v Ekspert
15. december 2003 - 21:06 #1
Hvilket Web Service kit bruger du ?  Axis ?
Avatar billede arne_v Ekspert
15. december 2003 - 21:08 #2
Du kan godt serialisere en java.util.Vector ifølge JAX-RPC standarden,
men det er ikke anbefalelsesværdigt, da den ikke er portabel til andre
programemrings sprog.

Et normalt array af objekter er portabelt (hvis objekterne er).
Avatar billede esset Nybegynder
15. december 2003 - 21:27 #3
Jeg ved godt at et array er, men når nu ikke størrelsen kende i forvejen hvad gør man så ?? Og når nu mit objekt indeholder et ubekendt antal styk af et andet objekt.....og desuden brokker den sig over min Disc klasse - vil det ændre sig hvis jeg opretter en array af objekter af denne klasse ???

Jeg bruger soap-2_3_1
Avatar billede esset Nybegynder
15. december 2003 - 21:28 #4
Jeg får denne fejl:

Call failed due to a SOAP Fault:
Fault code = SOAP-ENV:Server
Fault string = java.lang.IllegalArgumentException: No Serializer found to serialize a 'edu.dmu.mult3004.cd.Disc' using encoding style 'http://schemas.xmlsoap.org/soap/encoding/'.
[Attributes={}] [faultCode=SOAP-ENV:Server] [faultString=java.lang.IllegalArgumentException: No Serializer found to serialize a 'edu.dmu.mult3004.cd.Disc' using encoding style 'http://schemas.xmlsoap.org/soap/encoding/'.] [faultActorURI=/soap/servlet/rpcrouter] [DetailEntries=] [FaultEntries=]
Avatar billede arne_v Ekspert
15. december 2003 - 21:37 #5
Det er ikke noget problem.

Du kan bruge Vector internt men array til web service kald.

Når du skal returnere objektet til serveren så ved du jo hvor mange
elementer der er.

Det har jeg gjordt mange gange i Axis.
Avatar billede arne_v Ekspert
15. december 2003 - 21:38 #6
Jeg kender ikke Apache SOAP kun Apacje Axis.

I Axis skal man definere serializer og deserialiser factories for
alle ikke simple data typer.

Den kommer med en bean serializer og en array serializer.

Det angiver man i dpeloyment descriptoren (.wsdd filen).

Måske ligner SOAP Axis lidt.
Avatar billede esset Nybegynder
15. december 2003 - 22:17 #7
Jeg kan mærke at jeg er ved at gå lidt sukker kold her på de sene aftentimer...

Har du et forslag til hvordan jeg bærer mig ad med at lave mine objekter om til array. Jeg er selv ud i flg. men det har vist visse mangler ;o)

    private Vector cd = new Vector();
   
    public String[] getCD(String ID) throws SOAPException{
        DataConnect dc = new DataConnect();
        cd = dc.getCD(ID);
        String arrDisc[] = new String[cd.size()];
        for (int i=0; i < arrDisc.length; i++){
            Disc dsk = (Disc) cd.elementAt(i);
            String[] arrTrack[] = new String[dsk.getNoOfTracks()];
            for (int j=0; j < arrTrack.length; j++){
                Track tck = (Track) dsk.getTracks().elementAt(j);
                String arrTrackInfo[] = new String[2];
                arrTrackInfo[0] = tck.getName();
                arrTrackInfo[1] = tck.getLength();
                arrTrack[j] = arrTrackInfo[];
            }
           
        }
               
        return arrDisc;
    }
Avatar billede esset Nybegynder
15. december 2003 - 22:17 #8
Jeg mistede overblikket....
Avatar billede arne_v Ekspert
15. december 2003 - 22:33 #9
Du behøver ikke lave et array af String.

Et array af Tarck er OK, da Track er en ren bean.
Avatar billede arne_v Ekspert
15. december 2003 - 22:35 #10


cd.toArray()

burde faktisk være nok.
Avatar billede esset Nybegynder
15. december 2003 - 22:41 #11
Men når der nu kan være mere end en CD der returneres ??
Avatar billede esset Nybegynder
15. december 2003 - 22:43 #12
private Vector cd = new Vector();
   
    public Vector getCD(String ID) throws SOAPException{
        DataConnect dc = new DataConnect();
        cd = dc.getCD(ID);  //returnerer en Vector af Disc
        return cd;
    }
Avatar billede arne_v Ekspert
15. december 2003 - 22:44 #13
cd er så vidt jeg har forstået en Vector.

toArray vil returnere et array af de objekter vektoren indeholder.

De objekter er beans.

I Axis vil en ArraySerializer og en Bean Serializer kunne klare den
combo.

Min formodning er at Apache Soap kan det samme.
Avatar billede esset Nybegynder
15. december 2003 - 22:47 #14
private Vector cd = new Vector();
   
    public Vector getCD(String ID) throws SOAPException{
        DataConnect dc = new DataConnect();
        cd = dc.getCD(ID);  //returnerer en Vector af Disc
        return cd.toArray();  //Sådan ???
    }

Er det sådan den laves om til array - virker lidt for nemt.
Avatar billede arne_v Ekspert
15. december 2003 - 22:49 #15
public Object getCD(String ID) throws SOAPException {
        DataConnect dc = new DataConnect();
        return dc.getCD(ID).toArray();
    }
Avatar billede arne_v Ekspert
15. december 2003 - 22:50 #16
Hov jeg glemte []:

  public Object[] getCD(String ID) throws SOAPException {
        DataConnect dc = new DataConnect();
        return dc.getCD(ID).toArray();
    }
Avatar billede arne_v Ekspert
15. december 2003 - 22:51 #17
Hvis du skal have eksplicit type på så:

  public Track[] getCD(String ID) throws SOAPException {
        DataConnect dc = new DataConnect();
        Vector v = dc.getCD(ID);
        Track[] all = new Track[cd.size()];
        for(int i = 0; i < all.length; i++) all[i] = cd.get(i);
        return all;
    }
Avatar billede arne_v Ekspert
15. december 2003 - 22:52 #18
Hvorfor bruger du Apache Soap og ikke Apache Axis ?
Avatar billede esset Nybegynder
17. december 2003 - 23:39 #19
Tak for svaret. Jeg fik desværre ikke mine objekter igennem, men oprettede et simpelt array []. Det var det eneste der ville.

Jeg skulle bruge det til en skoleopg. og det var SOAP vi skulle bruge til opgaven.....

Læg et svar så får du dine point.
Avatar billede arne_v Ekspert
18. december 2003 - 06:35 #20
OK
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