Подтвердить что ты не робот

Преобразование String в объект класса

Я сохраняю объект класса в строку с помощью метода toString(). Теперь я хочу преобразовать строку в этот объект класса.

Как это сделать? Пожалуйста, помогите мне с исходным кодом.

4b9b3361

Ответ 1

Я сохраняю объект класса в строку, используя метод toString(). Теперь я хочу преобразовать строку в этот объект класса.

Ваш вопрос неоднозначен. Это может означать по крайней мере две разные вещи, одна из которых... ну... серьезное заблуждение с вашей стороны.


Если вы сделали это:

SomeClass object = ...
String s = object.toString();

то ответ заключается в том, что нет простого способа превратить s обратно в экземпляр SomeClass. Вы не могли этого сделать, даже если метод toString() дал вам одну из этих фанковых строк "SomeClass @xxxxxxxx". (Эта строка не кодирует состояние объекта или даже ссылку на объект. Часть xxxxxxxx является хэш-кодом идентификатора объекта. Она не уникальна и не может быть волшебным образом возвращена в ссылку на объект.)

Единственный способ вернуть результат toString обратно в объект:

  • запрограммируйте метод SomeClass.toString() так, чтобы он включал все соответствующие состояния для объекта в созданной String и
  • введите конструктор или метод factory, который явно проанализировал строку в формате, создаваемом методом toString().

Это, вероятно, плохой подход. Конечно, для нетривиальных классов очень много работы.


Если вы сделали что-то вроде этого:

SomeClass object = ...
Class c = object.getClass();
String cn = c.toString();

то вы можете получить тот же объект Class назад (т.е. тот, который находится в c) следующим образом:

Class c2 = Class.forName(cn);

Это дает вам Class, но нет волшебного способа восстановить исходный экземпляр, используя его. (Очевидно, что имя класса не содержит состояния объекта.)


Если вы ищете способ сериализации/десериализации произвольного объекта, не прилагая усилий к кодированию методов unparse/parse самостоятельно, то вы не должны использовать метод toString() в все. Вот несколько альтернатив, которые вы можете использовать:

  • API-интерфейсы Serialization Java, как описано в ссылках в ответе @Nishant.
  • Сериализация JSON, как описано в ответе @fatnjazzy.
  • Библиотека сериализации XML, такая как XStream.
  • Отображение ORM.

Каждый из этих подходов имеет свои преимущества и недостатки, о которых я не буду вдаваться здесь.

Ответ 2

Гораздо проще это сделать: вам понадобится com.google.gson.Gson для преобразования объекта в строку json для потоковой передачи

для преобразования объекта в строку json для потоковой передачи ниже кода

Gson gson = new Gson();
String jsonString = gson.toJson(MyObject);

Чтобы преобразовать обратно строку json в объект, используя код ниже:

Gson gson = new Gson();
MyObject = gson.fromJson(decodedString , MyObjectClass.class);

Более простой способ конвертировать объект для потоковой передачи и чтения с другой стороны. Надеюсь это поможет. - Vishesh

Ответ 3

Class.forName(nameString).newInstance();

Ответ 4

Я сохраняю объект класса в строку, используя метод toString(). Теперь я хочу преобразовать строку в этот объект класса.

Во-первых, если я понимаю ваш вопрос, вы хотите сохранить свой объект в String, а затем позже, чтобы снова прочитать его и заново создать объект.

Лично, когда мне нужно это сделать, я использую ObjectOutputStream. Однако есть обязательное условие. Объект, который вы хотите преобразовать в String, а затем назад к объекту, должен быть объектом Serializable, а также всеми его атрибутами.

Пусть рассмотрим ReadWriteObject, объект для манипулирования и ReadWriteTest манипулятор.

Вот как я это сделаю:

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);
    }
}

Стандартный вывод аналогичен этому (на самом деле, я не могу его скопировать/вставить):

¬í ?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]

Ответ 5

Как утверждают другие, ваш вопрос в лучшем случае неоднозначен. Проблема в том, что вы хотите представить объект как строку, а затем сможете снова построить объект из этой строки.

Однако обратите внимание, что, хотя многие типы объектов в Java имеют строковые представления, это не гарантирует, что объект может быть построен из его строкового представления.

Чтобы процитировать этот источник,

Сериализация объектов - это процесс сохранения состояния объекта в последовательности байтов, а также процесс перестройки этих байтов в живой объект в будущем.

Итак, вы видите, что вы хотите, возможно, не удастся. Но можно сохранить состояние объекта в байтовой последовательности, а затем восстановить его из этой последовательности байтов.

Ответ 6

Возможно, вы захотите сделать это с помощью json.
Преобразуйте bean (*) в json, а затем обратно.
этот процесс известен как сериализация и десериализация
читайте об этом здесь

(*) Не используйте только члены в качестве источника данных, создавайте геттеры и сеттеры для каждого члена вашего объекта.

Ответ 7

Продолжая мой комментарий. toString не является решением. Некоторая хорошая душа написала целый код для сериализации и десериализации объекта в Java. См. Здесь: http://www.javabeginner.com/uncategorized/java-serialization

Предлагаемое чтение:

Ответ 8

Вы не можете сохранить объект класса в строку, используя toString(), toString() возвращает только строковое представление вашего объекта - любым удобным для вас способом. Возможно, вам захочется немного почитать о Сериализация.

Ответ 9

Вы можете использовать инструкцию: -

Class c = s.getClass();

Получить экземпляр класса.