Java序列化 – Android反序列化

我尝试在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 。 但为什么? 序列化时我有相同的包,反序列化时包含相同的包。 所有不同的是项目名称。 你看到任何解决方案吗?

编辑 – 学生class的来源:

 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; } } 

我确信双方的两个版本的学生不一样。

因为例外是

java.lang.ClassCastException:javaserializace.Student。

这表明Java已经成功地反序列化了该对象,但是当它在接收器端将其类型转换为Student时,它会抛出exception,因为类型不同。

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

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

我发布的代码没有任何问题。 我的猜测是, Student双方并不是完全一致的。 因此,如果它是桌面上的“com.acme.Student”,它也应该是Android上的。

另外,最好添加serialVersionUID以防Student将来更改。

我建议您使用Kryo或Protocol Buffers之类的序列化。 较小的有效载荷会快得多。 唯一的缺点是你需要包括一个额外的jar子。