Надежно конвертировать любой объект в строку, а затем обратно - PullRequest
35 голосов
/ 17 января 2012

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

Ответы [ 6 ]

59 голосов
/ 17 января 2012

Да, это называется сериализация !

 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);
 }
15 голосов
/ 13 октября 2015

Это код:

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();         
}
12 голосов
/ 17 января 2012

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

5 голосов
/ 17 января 2012

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

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

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

3 голосов
/ 17 января 2012

Да, это Сериализация Вы можете использовать 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();
3 голосов
/ 17 января 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...