日期:2014-05-20  浏览次数:20719 次

【请教】使用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编码成了字节流呢?