web-dev-qa-db-fra.com

Convertissez de manière fiable n'importe quel objet en chaîne, puis de nouveau

Existe-t-il un moyen fiable de convertir n'importe quel objet en chaîne, puis de nouveau dans le même objet? J'ai vu quelques exemples de personnes les convertissant à l'aide de toString(), puis transmettant cette valeur à un constructeur pour reconstruire à nouveau l'objet, mais tous les objets n'ont pas un constructeur comme celui-ci, de sorte que la méthode ne fonctionnera pas dans tous les cas. De quelle façon?

36
user596186

Oui, cela s'appelle sérialisation !

 String serializedObject = "";

 // serialize the object
 try {
     ByteArrayOutputStream bo = new ByteArrayOutputStream();
     ObjectOutputStream so = new ObjectOutputStream(bo);
     so.writeObject(myObject);
     so.flush();
     serializedObject = bo.toString();
 } catch (Exception e) {
     System.out.println(e);
 }

 // deserialize the object
 try {
     byte b[] = serializedObject.getBytes(); 
     ByteArrayInputStream bi = new ByteArrayInputStream(b);
     ObjectInputStream si = new ObjectInputStream(bi);
     MyObject obj = (MyObject) si.readObject();
 } catch (Exception e) {
     System.out.println(e);
 }
61
Andrew

Voici le code:

try {
    ByteArrayOutputStream bo = new ByteArrayOutputStream();
    ObjectOutputStream so = new ObjectOutputStream(bo);
    so.writeObject(stringList);
    so.flush();
    redisString = new String(Base64.encode(bo.toByteArray()));       
} 
catch (Exception e) {
    e.printStackTrace();
}

try {
    byte b[] = Base64.decode(redisString.getBytes()); 
    ByteArrayInputStream bi = new ByteArrayInputStream(b);
    ObjectInputStream si = new ObjectInputStream(bi);
    List<String> stringList2 = (List<String>)si.readObject();
    System.out.println(stringList2.get(1));          
} 
catch (Exception e) {
    e.printStackTrace();         
}
15
Ashwini Adlakha

Sérialiser en tableau d'octets, convertir en Base64. Décodez ensuite Base64 pour revenir au tableau d'octets et désérialisez.

12
Tomasz Nurkiewicz

Aucun ne fonctionnera dans tous les cas. Un objet peut, par exemple, contenir des références à d'autres machines virtuelles Java gérant leur état, et cet état peut ne pas être disponible pour vous à restaurer.

Les problèmes supplémentaires que vous allez rencontrer incluent les flux ouverts, les sockets d'écoute et presque tout le reste du monde extérieur.

Inutile de répéter cela plus au moins deux des Java principaux disent que la sérialisation était l'une des plus grandes erreurs une des pires caractéristiques de Java, c'est-à-dire après la finalisation. (J'adore néanmoins la sérialisation, c'est pratique. Mais cela ne fonctionnera pas toujours.)

5
alf

Oui, c'est Sérialisation Vous pouvez utiliser, ObjectInputStream.readObject et ObjectOutputStream.writeObject. Veuillez voir l'exemple ci-dessous:

MyClass myClass = new MyClass();
FileOutputStream fileStream = new FileOutputStream("myObjectFile.txt");
ObjectOutputStream os = new ObjectOutputStream(fileStream);
os.writeObject(os);
os.close();

FileInputStream fileInStream = new FileInputStream("myObjectFile.txt");
ObjectInputStream ois = new ObjectInputStream(fileInStream);
MyClass myClass2 = ois.readObject();
ois.close();
3
HRgiger

Une façon consiste à utiliser JSON. Pour une implémentation spécifique à Java, la réponse pourrait être donnée dans cet article:

Code Java correspondant à Newtonsoft.Json.JsonConvert.SerializeObject (Source d'objet, Newtonsoft.Json.JsonSerializerSettings ()) dans .net?

L'utilisation de JSON est suffisamment fiable pour être utilisée pour le développement d'applications Web (Ajax).

3
Kevin Le - Khnle