Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di EngLab
    Registrato dal
    Jan 2006
    Messaggi
    496

    [JAVA] - Acquisire oggetto serializzato senza disponibilità della sua classe

    Sto sbattendo la testa su un altro problema assurdo (soprattutto per come è fatto Java). Ho un server che serializza un oggetto e lo manda al server (per ora ho fatto copia-incolla nella cartella del server, l'implementazione del metodo la farò dopo). La classe dell'oggetto che viene serializzato è disponibile solo sul server (il client deve avere lo stretto necessario).

    Ora, quando vado a leggere il file e quindi l'oggetto, faccio

    Codice PHP:
    loadedDecisionTree = (Object)decTreeObj.readObject(); 
    però, alla lettura del file, mi restituisce:

    java.lang.ClassNotFoundException: classificator.tree.MyClass

    cioè non riesce a trovare la classe di appartenenza dell'oggetto, e quindi non procede.
    Sono rimasto abbastanza , poichè facendo il casting a Object non dovrei avere errori di questo tipo... credo.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] - Acquisire oggetto serializzato senza disponibilità della sua classe

    Originariamente inviato da EngLab
    Ora, quando vado a leggere il file e quindi l'oggetto, faccio

    Codice PHP:
    loadedDecisionTree = (Object)decTreeObj.readObject(); 
    però, alla lettura del file, mi restituisce:

    java.lang.ClassNotFoundException: classificator.tree.MyClass

    cioè non riesce a trovare la classe di appartenenza dell'oggetto, e quindi non procede.
    Sono rimasto abbastanza , poichè facendo il casting a Object non dovrei avere errori di questo tipo... credo.
    Come dici, la classe che definisce l'oggetto serializzato è solo sul server. Pertanto non è questione del cast ad Object, questo non vuol dire assolutamente nulla. Il client deve avere/ottenere, in un modo o nell'altro, la definizione della classe.
    Per default, per come è fatta la "serializzazione" di base, si aspetta che la classe sia rintracciabile tramite il "classpath" locale, il che vuol dire appunto che la definizione della classe dovrebbe essere già sul client.

    Questo non vuol dire che quello che vorresti fare tu è impossibile. Si può di certo fare e se si guarda nelle pieghe della documentazione di ObjectOutputStream ci si imbatte in un metodo protected annotateClass() la cui documentazione dice:

    Subclasses may implement this method to allow class data to be stored in the stream. [...] This method may make free use of the ObjectOutputStream to save any representation of the class it deems suitable (for example, the bytes of the class file).

    e anche di conseguenza come spiega centra il resolveClass() di ObjectInputStream.

    Quindi estendendo i due stream, implementando i due metodi e facendo anche qualcosa, credo, a livello del ClassLoader, sarebbe di certo fattibile. Io personalmente non l'ho mai fatto .... se mi ci mettessi e con tutta la documentazione sottomano, probabilmente riuscirei a farlo.

    Originariamente inviato da EngLab
    su un altro problema assurdo (soprattutto per come è fatto Java).
    Stai cercando di fare una cosa abbastanza particolare e "avanzata". Non è "assurdo".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di EngLab
    Registrato dal
    Jan 2006
    Messaggi
    496
    Oppure faccio scrivere al server così:

    Codice PHP:
    out.writeObject((Object)myObject); 
    In questa maniera il server passa al client un oggetto Object, che il client può scrivere su file e rileggere a piacimento. Poi, quando l'oggetto viene ripassato al server, il server rieseguirà il casting su MyClass.

    Dici che funzionerà?

    Grazie.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da EngLab
    Dici che funzionerà?
    No, mi spiace, non ha chiara la questione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di EngLab
    Registrato dal
    Jan 2006
    Messaggi
    496
    Originariamente inviato da andbin
    No, mi spiace, non ha chiara la questione.
    Ho provato ad inviare il dato come oggetto e, in effetti, non funziona, mi chiede comunque la classe di appartenenza. Poichè implementare l'RMI era un tantino lunghetto, ho risolto trasformando l'oggetto in un byte[] e inviandolo al client come tale. In questa maniera il server effettua correttamente il casting da byte[] alla classe giusta quando gli viene reinviato via socket.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.