2010-11-23 3 views
0

J'ai un tableau que j'ai créé à partir d'une base de données ResultSet. J'essaye de le sérialiser afin que je puisse l'envoyer au-dessus d'un flux de douille. Pour le moment, je reçois une erreur me disant que le tableau n'est pas sérialisable. Le code que j'ai est en dessous, la première partie est la classe pour créer un objet pour le tableau:Sérialiser un groupe d'objets pour envoyer des sockets

class ProteinData 
{ 
    private int ProteinKey; 

    public ProteinData(Integer ProteinKey) 
    { 
     this.ProteinKey = ProteinKey; 
    } 

    public Integer getProteinKey() { 
     return this.ProteinKey; 
    } 

    public void setProteinKey(Integer ProteinKey) { 
     this.ProteinKey = ProteinKey; 
    } 
} 

Le code pour remplir le tableau:

public List<ProteinData> readJavaObject(String query, Connection con) throws Exception 
    {   
     PreparedStatement stmt = con.prepareStatement(query); 
     query_results = stmt.executeQuery(); 
     while (query_results.next()) 
     { 
      ProteinData pro = new ProteinData(); 
      pro.setProteinKey(query_results.getInt("ProteinKey")); 
      tableData.add(pro); 
     } 
     query_results.close(); 
     stmt.close(); 
     return tableData; 
    } 

Et le code pour appeler ceci est :

Et le code recieving ceci est:

List dataList = (List) input_stream.readObject(); 

Quelqu'un peut-il m'aider à sérialiser ce tableau. Tout ce que je peux trouver dans les forums est simple tableaux (par exemple, int []).

J'ai essayé d'ajouter la sérialisable à la classe et le numéro UID, mais j'ai reçu le message d'erreur java.lang.ClassNotFoundException: socketserver.ProteinData. Est-ce que quelqu'un maintenant pourquoi?

Merci pour toute aide.

+0

Je ne vois aucun tableau dans votre code ... seulement Liste

+0

si la méthode 'readJavaObject()' est la méthode complète, vous allez avoir d'autres problèmes sur la ligne comme il vous semble utilisent une liste de niveau classe pour renvoyer des résultats pour chaque appel de méthode. –

Répondre

6

Fondamentalement, vous avez besoin que les classes que vous voulez sérialiser sont la mise en œuvre Serializable. Et si vous voulez éviter l'avertissement lié à la série, vous devriez également avoir un long serialVersionUID pour chacun d'eux, c'est un code utilisé pour distinguer votre version spécifique de la classe. Lire un tutoriel comme this one pour obtenir des informations supplémentaires, la sérialisation n'est pas si difficile à gérer ..

Cependant, rappelez-vous que la sérialisation est défectueuse lorsqu'elle est utilisée entre deux versions différentes de la JVM (et elle a quelques failles en général). Juste un petit côté: l'interface Serializable ne donne aucune fonctionnalité requise à la classe elle-même (ce n'est pas une interface typique) et elle est utilisée juste pour distinguer les classes qui sont censées être envoyées sur les flux et toutes les autres. Bien sûr, si une classe est Serializable, tout le composant qu'elle utilise (variables d'instance) doit également être sérialisable pour pouvoir envoyer l'objet entier.

4

Modifier votre déclaration de classe à:

classe ProteinData implémente Serializable { ...}

1

je l'aurais pensé au minimum que vous auriez besoin

classe ProteinData implémente Serializable et

finale privée statique à long serialVersionUID = 1234556L; (Eclipse va générer le nombre magique pour vous). dans la classe.

Questions connexes