【问题标题】:Java serialization - Android deserializationJava序列化——Android反序列化
【发布时间】:2011-09-23 11:34:10
【问题描述】:

我尝试在 Java 和 Android 之间实现跨平台序列化。我使用了 Serializable,并将我的代码在 Android 中与桌面 Java 放在同一个包中。

来源:java-desktop 序列化

    Student student=new Student(); 
    student.setName("John");
    student.setSurname("Brown");
    student.setNumber(776012345);

    try {
      FileOutputStream fout = new FileOutputStream("thestudent.dat");
      ObjectOutputStream oos = new ObjectOutputStream(fout);
      oos.writeObject(student);
      oos.close();
    }
      catch (Exception e) { e.printStackTrace(); }

    }

来源:Android - 反序列化

File file=new File(getExternalFilesDir(null), "thestudent.dat");

    try {

      FileInputStream fint = new FileInputStream(file);
      ObjectInputStream ois = new ObjectInputStream(fint);
      Student stud=(Student) ois.readObject();
      ois.close();
    }
      catch (Exception e) { e.printStackTrace(); }

}

Student 是一个实现 Serializable 的类。在桌面上,我将学生实例序列化为“thestudent.dat”。我把这个文件放在 Android 设备的 SD 卡上,我正在尝试反序列化它。我收到错误 java.lang.ClassCastException: javaserializace.Student。但为什么?序列化时我有相同的包,反序列化时有相同的包。所有不同的是项目名称。你有什么解决办法吗?

已编辑 - Student 课程的来源:

public class Student implements Serializable {

private String name;
private String surname;
private int number;
private char gender;
private int age;
private long rc;
private int id;

public Student(){
    ;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public char getGender() {
    return gender;
}

public void setGender(char gender) {
    this.gender = gender;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public long getRc() {
    return rc;
}

public void setRc(long rc) {
    this.rc = rc;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getNumber() {
    return number;
}

public void setNumber(int number) {
    this.number = number;
}

public String getSurname() {
    return surname;
}

public void setSurname(String surname) {
    this.surname = surname;
}

}

【问题讨论】:

  • 你也可以发Student类吗?
  • 它们在一个包中吗?你确定他真的是同一个班级吗?
  • 如果没有别的,你应该有一个serialVersionUID。另外,为什么不直接使用 JSON/etc?
  • 是的,它有相同的类名...

标签: java android serialization deserialization


【解决方案1】:

我可以肯定,双方的两个版本的学生是不一样的。

因为例外是

java.lang.ClassCastException: javaserializace.Student.

这表明 Java 已成功反序列化该对象,但在接收方将其类型转换为 Student 时,由于类型不同而引发异常。

一种快速的调试方法是在接收到的 Student 对象上调用 getClass() 并在接收器上的 Student 类上调用 getName() 。我确信在这种情况下两者都是不同的。

解决方案是确保接收方的学生是同一类型。

【讨论】:

  • 对……他们不一样,但他们应该是。我必须完全重做这个反序列化任务。谢谢
【解决方案2】:

我认为您发布的代码没有任何问题。我的猜测是Student 两边都不在同一个包中。因此,如果它是桌面上的“com.acme.Student”,那么它也应该是 Android 上的。

添加serialVersionUID 也是一个好主意,以防您的Student 将来发生变化。

【讨论】:

  • 谢谢,它们在同一个包中……这就是我写在这里的原因。
【解决方案3】:

我建议使用KryoProtocol Buffers 之类的东西进行序列化。更小的有效载荷会更快。唯一的缺点是您需要包含一个额外的 jar。

【讨论】: