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?
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);
}
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();
}
Sérialiser en tableau d'octets, convertir en Base64. Décodez ensuite Base64 pour revenir au tableau d'octets et désérialisez.
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.)
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();
Une façon consiste à utiliser JSON. Pour une implémentation spécifique à Java, la réponse pourrait être donnée dans cet article:
L'utilisation de JSON est suffisamment fiable pour être utilisée pour le développement d'applications Web (Ajax).