可靠地将任何对象转换为String然后再返回

有没有可靠的方法将任何对象转换为String然后再返回到同一个对象? 我已经看到一些人使用toString()转换它们的例子,然后将该值传递给构造函数再次重构对象,但并非所有对象都有这样的构造函数,因此该方法不适用于所有情况。 会怎么样?

是的,它被称为序列化 !

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

序列化为字节数组,转换为Base64。 然后将Base64解码回字节数组并反序列化。

这是代码:

  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 stringList2 = (List)si.readObject(); System.out.println(stringList2.get(1)); } catch (Exception e) { e.printStackTrace(); } 

没有人会在所有情况下都有效。 对象可以例如包含对处理其状态的其他JVM的引用,并且该状态可能无法用于恢复。

您将要遇到的其他问题包括开放流,侦听套接字以及来自外部世界的几乎任何其他问题。

没有必要重复,至少有两位Java核心工程师说序列化是Java中最糟糕的一个错误 ,也就是说,在最终确定之后。 (尽管我喜欢序列化,但它很方便。但它并不总能奏效。)

一种方法是使用JSON。 对于Java中特定的实现,可以在这篇文章中给出答案:

对应于.net中的Newtonsoft.Json.JsonConvert.SerializeObject(Object source,Newtonsoft.Json.JsonSerializerSettings())的java代码?

使用JSON足够可靠,它用于Web应用程序开发(Ajax)。

是的,它是序列化您可以使用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();