我使用ObjectOutputStream(new ByteArrayOutputStream()).writeObject将一个JavaBean对象写入一个字符串content,
然后使用ObjectInputStream(new ByteArrayInputStream(content.getBytes())).readObject()却读不出来。
并且跑出异常:
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2279)
最后发现必须指定编码格式为ISO-8859-1才行(其他编码不行,比如GBK、UTF-8)。但是不知道什么原因。
难道writeObject是按照ISO-8859-1编码写入字节流的吗?是否可以指定编码格式呢?
问题代码:
- Java code
//将对象写入字符串public static String serialzeToString(Object o){ ObjectOutputStream os = null; try{ ByteArrayOutputStream bs = new ByteArrayOutputStream(); os = new ObjectOutputStream(bs); os.writeObject(o); byte[] bytes = bs.toByteArray(); String retStr = new String(bytes); return retStr; }catch(Exception e){ e.printStackTrace(); return null; } }
- Java code
//从字符串中读取出对象public static Object derialzeFromString(String content){ ObjectInputStream ois = null; try{ byte[] bytes = content.getBytes(); ByteArrayInputStream bs = new ByteArrayInputStream(bytes); ois = new ObjectInputStream(bs); Object o = ois.readObject(); return o; }catch(Exception e){ e.printStackTrace(); return null; } }
按照ISO-8850-1编解码就可以了
修改后的代码:
- Java code
//将对象写入字符串public static String serialzeToString(Object o){ ObjectOutputStream os = null; try{ ByteArrayOutputStream bs = new ByteArrayOutputStream(); os = new ObjectOutputStream(bs); os.writeObject(o); byte[] bytes = bs.toByteArray(); String retStr = new String(bytes,"ISO-8859-1"); //按照ISO-8859-1解码 return retStr; }catch(Exception e){ e.printStackTrace(); return null; } }
- Java code
//从字符串中读取出对象public static Object derialzeFromString(String content){ ObjectInputStream ois = null; try{ byte[] bytes = content.getBytes("ISO-8859-1");//按照ISO-8859-1编码 ByteArrayInputStream bs = new ByteArrayInputStream(bytes); ois = new ObjectInputStream(bs); Object o = ois.readObject(); return o; }catch(Exception e){ e.printStackTrace(); return null; } }
------解决方案--------------------