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

时间:2012-01-16 22:30:33

标签: java string object

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

7 个答案:

答案 0 :(得分:59)

是的,它被称为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);
 }

答案 1 :(得分:13)

这是代码:

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

答案 2 :(得分:12)

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

答案 3 :(得分:5)

所有情况下都无效。对象可能包含对处理其状态的其他JVM的引用,并且此状态可能无法让您恢复。

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

没有必要重复大多数至少有两位Java核心工程师说序列化是最大的错误之一是Java中最糟糕的一个特性,也就是说,完成后。 (尽管我喜欢序列化,但它很方便。但它不会始终工作。)

答案 4 :(得分:3)

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

java code corresponding to Newtonsoft.Json.JsonConvert.SerializeObject(Object source,Newtonsoft.Json.JsonSerializerSettings()) in .net?

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

答案 5 :(得分:3)

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

答案 6 :(得分:0)

您可以使用org.apache.commons中的SerializationUtils。
它提供了方法serializedeserialize