Je stocke un objet de classe dans une chaîne en utilisant la méthode toString()
. Maintenant, je veux convertir la chaîne en cet objet de classe.
Comment faire ça? Veuillez m'aider avec le code source.
Je stocke un objet de classe dans une chaîne en utilisant la méthode toString (). Maintenant, je veux convertir la chaîne en cet objet de classe.
Votre question est ambiguë. Cela pourrait signifier au moins deux choses différentes, dont l'une est ... eh bien ... une grave idée fausse de votre part.
Si vous avez fait ceci:
SomeClass object = ...
String s = object.toString();
alors la réponse est qu'il n'y a pas de moyen simple de reconvertir s
en une instance de SomeClass
. Vous ne pouvez pas le faire même si la méthode toString()
vous donne une de ces chaînes funky "SomeClass @ xxxxxxxx". (Cette chaîne ne code pas l'état de l'objet, ni même une référence à l'objet. La partie xxxxxxxx est le code de hachage d'identité de l'objet . Ce n'est pas unique et ne peut pas être transformé par magie en référence à l'objet.)
La seule façon de transformer la sortie de toString
en objet serait de:
SomeClass.toString()
de manière à inclure tous les états pertinents pour l'objet dans la chaîne qu'il a produite, ettoString()
.C'est probablement une mauvaise approche. Certes, cela demande beaucoup de travail pour les classes non triviales.
Si vous avez fait quelque chose comme ça:
SomeClass object = ...
Class c = object.getClass();
String cn = c.toString();
alors vous pouvez récupérer le même objet Class
(c'est-à-dire celui qui est dans c
) comme suit:
Class c2 = Class.forName(cn);
Cela vous donne le Class
mais il n'y a aucun moyen magique de reconstruire l'instance d'origine en l'utilisant. (Évidemment, le nom de la classe ne contient pas l'état de l'objet.)
Si vous cherchez un moyen de sérialiser/désérialiser un objet arbitraire sans faire l'effort de coder vous-même les méthodes d'analyse/d'analyse, alors vous - ne devrait pas utiliser la méthode toString()
du tout. Voici quelques alternatives que vous pouvez utiliser:
Chacune de ces approches a des avantages et des inconvénients ... que je n'entrerai pas ici.
Une manière beaucoup plus simple de le faire: vous aurez besoin de com.google.gson.Gson pour convertir l'objet en chaîne json pour le streaming
pour convertir un objet en chaîne json pour le streaming, utilisez le code ci-dessous
Gson gson = new Gson();
String jsonString = gson.toJson(MyObject);
Pour reconvertir la chaîne json en objet, utilisez le code ci-dessous:
Gson gson = new Gson();
MyObject = gson.fromJson(decodedString , MyObjectClass.class);
Un moyen beaucoup plus facile de convertir un objet pour le streaming et de le lire de l'autre côté. J'espère que cela t'aides. - Vishesh
Class.forName(nameString).newInstance();
Je stocke un objet de classe dans une chaîne en utilisant la méthode toString (). Maintenant, je veux convertir la chaîne en cet objet de classe.
Tout d'abord, si je comprends votre question, vous souhaitez stocker votre objet dans une chaîne, puis plus tard pour pouvoir le relire et recréer l'objet.
Personnellement, lorsque je dois le faire, j'utilise ObjectOutputStream. Cependant, il y a une condition obligatoire. L'objet que vous souhaitez convertir en chaîne, puis revenir en objet, doit être un objet sérialisable, ainsi que tous ses attributs.
Considérons ReadWriteObject
, l'objet à manipuler et ReadWriteTest
le manipulateur.
Voici comment je le ferais:
public class ReadWriteObject implements Serializable {
/** Serial Version UID */
private static final long serialVersionUID = 8008750006656191706L;
private int age;
private String firstName;
private String lastName;
/**
* @param age
* @param firstName
* @param lastName
*/
public ReadWriteObject(int age, String firstName, String lastName) {
super();
this.age = age;
this.firstName = firstName;
this.lastName = lastName;
}
/*
* (non-Javadoc)
*
* @see Java.lang.Object#toString()
*/
@Override
public String toString() {
return "ReadWriteObject [age=" + age + ", firstName=" + firstName + ", lastName=" + lastName + "]";
}
}
public class ReadWriteTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// Create Object to write and then to read
// This object must be Serializable, and all its subobjects as well
ReadWriteObject inputObject = new ReadWriteObject(18, "John", "Doe");
// Read Write Object test
// Write Object into a Byte Array
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(inputObject);
byte[] rawData = baos.toByteArray();
String rawString = new String(rawData);
System.out.println(rawString);
// Read Object from the Byte Array
byte[] byteArrayFromString = rawString.getBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(byteArrayFromString);
ObjectInputStream ois = new ObjectInputStream(bais);
Object outputObject = ois.readObject();
System.out.println(outputObject);
}
}
La sortie standard est similaire à celle (en fait, je ne peux pas la copier/coller):
¬í ?sr ?*com.ajoumady.stackoverflow.ReadWriteObjecto$˲é¦LÚ ?I ?ageL ?firstNamet ?Ljava/lang/String;L ?lastNameq ~ ?xp ?t ?John ?Doe
ReadWriteObject [age=18, firstName=John, lastName=Doe]
Vous voudrez peut-être le faire avec json.
Convertissez votre bean (*) en json an puis retour.
ce processus est appelé sérialisation et désérialisation
lire à ce sujet ici
(*) Ne pas utiliser uniquement des membres comme source de données, créer des getters et setters pour chaque membre de votre objet.
Comme indiqué par d'autres, votre question est au mieux ambiguë. Le problème est que vous souhaitez représenter l'objet sous la forme d'une chaîne, puis pouvoir à nouveau construire l'objet à partir de cette chaîne.
Cependant, notez que bien que de nombreux types d'objets dans Java ont des représentations de chaîne, cela ne garantit pas qu'un objet peut être construit à partir de sa représentation de chaîne.
Pour citer cette source ,
La sérialisation d'objet est le processus d'enregistrement de l'état d'un objet dans une séquence d'octets, ainsi que le processus de reconstruction de ces octets dans un objet actif à un moment ultérieur.
Donc, vous voyez, ce que vous voulez n'est peut-être pas possible. Mais il est possible d'enregistrer l'état de votre objet dans une séquence d'octets, puis de le reconstruire à partir de cette séquence d'octets.
Suite de mon commentaire. toString
n'est pas la solution. Une bonne âme a écrit du code entier pour la sérialisation et la désérialisation d'un objet en Java. Voir ici: http://www.javabeginner.com/uncategorized/Java-serialization
Lecture suggérée:
Vous ne pouvez pas stocker un objet de classe dans une chaîne à l'aide de toString (), toString () ne renvoie qu'une représentation String de votre objet, comme vous le souhaitez. Vous voudrez peut-être faire quelques lectures sur Sérialisation .
Vous pouvez utiliser la déclaration: -
Class c = s.getClass();
Pour obtenir l'instance de classe.