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

Надежно преобразуйте любой объект в String, а затем обратно

Есть ли надежный способ преобразования любого объекта в String, а затем обратно в тот же объект? Я видел несколько примеров преобразования людей с помощью toString(), а затем передал это значение в конструктор для повторной реконструкции объекта, но не у всех объектов есть такой конструктор, чтобы этот метод не работал для всех случаев. Каким будет?

4b9b3361

Ответ 1

Да, он называется serialization!

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

Ответ 2

Это код:

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

Ответ 3

Сериализовать в байтовый массив, конвертировать в Base64. Затем декодируем Base64 обратно в массив байтов и десериализуем.

Ответ 4

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

Дополнительные проблемы, которые вы собираетесь встретить, будут включать открытые потоки, прослушивающие сокеты и почти все остальное из внешнего мира.

Нет необходимости повторять, что most, по крайней мере, два из ядровых инженеров Java говорят, что сериализация была одной из самых больших ошибок единственной худшей особенностью Java, после завершения. (Тем не менее, я люблю сериализацию, но это не всегда работает.)

Ответ 5

Один из способов - использовать JSON. Для реализации, специфичной для Java, ответ может быть указан в этом сообщении:

java-код, соответствующий Newtonsoft.Json.JsonConvert.SerializeObject(источник объекта, Newtonsoft.Json.JsonSerializerSettings()) в .net?

Использование JSON достаточно надёжно, что оно используется для разработки веб-приложений (Ajax).

Ответ 6

Да, это Сериализация. Вы можете использовать ObjectInputStream.readObject и ObjectOutputStream.writeObject. Пример ниже:

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

Ответ 7

Вы можете использовать SerializationUtils из org.apache.commons.
Он предоставляет методы serialize и deserialize