当前位置: 代码迷 >> J2SE >> 【请问】使用ObjectInputStream的readObject无法读出带有中文的对象
  详细解决方案

【请问】使用ObjectInputStream的readObject无法读出带有中文的对象

热度:286   发布时间:2016-04-24 01:52:06.0
【请教】使用ObjectInputStream的readObject无法读出带有中文的对象
我使用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;        }    }


------解决方案--------------------
探讨
为什么其他编码不合适呢?比如GBK、UTF-8.所以我觉得是不是ObjectOutputStream在写入时将对象中的中文以ISO-8859-1编码成了字节流呢?