web-dev-qa-db-fra.com

Convertir une chaîne en un objet de classe

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.

24
androidGuy

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:

  • coder la méthode SomeClass.toString() de manière à inclure tous les états pertinents pour l'objet dans la chaîne qu'il a produite, et
  • coder un constructeur ou une méthode d'usine qui a explicitement analysé une chaîne au format produit par la méthode toString().

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:

  • Les API Java Sérialisation d'objets comme décrit dans les liens dans la réponse de @ Nishant.
  • La sérialisation JSON comme décrit dans la réponse de @ fatnjazzy.
  • Une bibliothèque de sérialisation XML comme XStream.
  • Un mappage ORM.

Chacune de ces approches a des avantages et des inconvénients ... que je n'entrerai pas ici.

27
Stephen C

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

18
user2516769
Class.forName(nameString).newInstance();
6
TurtleToes

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]

2
ajoumady

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.

1
fatnjazzy

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.

1
K_U

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:

  1. Ancien et bon article technique Java sur la sérialisation
  2. http://Java.Sun.com/developer/technicalArticles/ALT/serialization/
  3. http://Java.Sun.com/developer/onlineTraining/Programming/BasicJava2/serial.html
0
Nishant

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 .

0
Erkan Haspulat

Vous pouvez utiliser la déclaration: -

Class c = s.getClass();

Pour obtenir l'instance de classe.

0
Anshul