本帖最后由 jsjszg 于 2012-02-19 12:59:57 编辑

解决方案 »

  1.   

    楼主,你的问题并不是出在readObject或者writeObject的问题;而是你想把byte[]转成String来传输或存储。而byte[]转换为String,才会存在编码问题;因为这种情况下Java会试图把byte数组去跟字符集做映射,对照时出错是很正常的。不信的话,你可以把byte[]直接用BASE64编码为String,一样能解决问题。
      

  2.   

    问题补充:
       没有写入文件,就是把对象写入字符串,然后再从字符串中读取出来。测试代码:
    public class SerializeDemo {

    private static void testPerson(Person p){
    String str = SerializableTool.serialzeToString(p);
    Person p2 = (Person)SerializableTool.derialzeFromString(str);
    } public static void main(String[] args) {
    Person me = new Person(2,"abcd我1234",Gender.Male);
    testPerson(me);
    }
    }import java.io.Serializable;public class Person implements Serializable {
    private static final long serialVersionUID = 1L; public enum Gender{
    Male, Femal;
    } private int id;
    private String name;
    private Gender gender;

    public Person(){}
    public Person(int id,String name,Gender gender){
    this.id = id;
    this.name = name;
    this.gender = gender;
    }

    public int getId() {
    return id;
    }
    public void setId(int id) {
    this.id = id;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public Gender getGender() {
    return gender;
    }
    public void setGender(Gender gender) {
    this.gender = gender;
    }
    }
      

  3.   

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

  4.   


    不是。因为GBK和UTF-8都是大字符集(多byte才构成一个char),编码都是有对照关系的。比如你的byte恰好出现 [255][255],那么根本从GBK中根本找不到一个汉字的字节码是[255][255],必然完蛋。但ISO-8859-1是单字符集(一个byte就是一个char),所以从[0]~[255]都能找到对应的字符(char)。楼主,一般来说如果是文件操作或者是网络传输,根本不会转换为String,直接把byte[]数组完整写进文件就完了。如果你实在是非常非常希望能变成String,那么就BASE64编码,这才是国际通用做法。
      

  5.   


    可以直接用 blob 类型,反正无论存进去的是String还是二进制还是BASE64后的东西,你肉眼都看不懂。