如何二进制(de)将对象序列化为/ form string?

我需要将对象序列化为String并反序列化。

我在stackoverflow上重写sugestion并生成以下代码:

class Data implements Serializable { int x = 5; int y = 3; } public class Test { public static void main(String[] args) { Data data = new Data(); String out; try { // zapis ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(data); out = new String(baos.toByteArray()); System.out.println(out); // odczyt.========================================== ByteArrayInputStream bais = new ByteArrayInputStream(out.getBytes()); ObjectInputStream ois = new ObjectInputStream(bais); Data d = (Data) ois.readObject(); System.out.println("dx = " + dx); System.out.println("dy = " + dy); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } 

}

但我得到错误:

 java.io.StreamCorruptedException: invalid stream header: EFBFBDEF at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801) at java.io.ObjectInputStream.(ObjectInputStream.java:298) at p.Test.main(Test.java:37) 

为什么? 我期望:dx = 5 dy = 3

如何做得好? 啊。 我不想在文件中写这个对象。 我必须以字符串格式。

使用
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); 而不是ByteArrayInputStream bais = new ByteArrayInputStream(out.getBytes()); ,因为String转换会破坏数据(因为编码)。

如果确实需要将结果存储在String中,则需要一种安全的方法来在String中存储任意字节。 一种方法是使用Base64编码。

一种完全不同的方法是不对此类使用标准Java序列化,而是创建自己的数据到/从String转换器。

转换为字符串会破坏数据并不完全正确。 转换为“UTF-8”是因为它不是双射的(某些字符是2个字节,但不允许所有2个字节序列作为字符序列),而“ISO-8859-1”是双射的(字符串的1个字符是a字节,反之亦然)。

与此相比,Base64编码的空间效率不是很高。

这就是我建议的原因:

 /** * Serialize any object * @param obj * @return */ public static String serialize(Object obj) { try { ByteArrayOutputStream bo = new ByteArrayOutputStream(); ObjectOutputStream so = new ObjectOutputStream(bo); so.writeObject(obj); so.flush(); // This encoding induces a bijection between byte[] and String (unlike UTF-8) return bo.toString("ISO-8859-1"); } catch (Exception e) { e.printStackTrace(); } } /** * Deserialize any object * @param str * @param cls * @return */ public static  T deserialize(String str, Class cls) { // deserialize the object try { // This encoding induces a bijection between byte[] and String (unlike UTF-8) byte b[] = str.getBytes("ISO-8859-1"); ByteArrayInputStream bi = new ByteArrayInputStream(b); ObjectInputStream si = new ObjectInputStream(bi); return cls.cast(si.readObject()); } catch (Exception e) { e.printStackTrace(); } }