Android开发笔记(二十四) 序列化

  • 1. Serializable

流程:

    1. 带数据的类implements Serializable,子类也要,如下,getter和setter自己加
public class Student implements Serializable {
    private String name;
    private transient int age; // 不序列化保存的用transient
    private Score score;
}

class Score implements Serializable{
    private int math;
    private String grade;
}
    1. 输出到文件
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(openFileOutput(FILE_NAME, MODE_PRIVATE));//覆盖
            objectOutputStream.writeObject(student);
            objectOutputStream.flush(); // 清空缓存
            objectOutputStream.close();
    1. 读取:
                ObjectInputStream objectInputStream = new ObjectInputStream(openFileInput(FILE_NAME));
                Student student1 = (Student) objectInputStream.readObject();
    1. 关于 transient:
      测试1:transient int型,读取后输出结果为0
      测试2:transient Object型,可读取,输出报错,因为Object为null
      测试3:transient String,可读取,输出为null
  • 注意事项
    该接口会自动定义一个long型版本号,若数据结构发生改变,则以前保存的数据读取不出来,解决方法:人为添加版本号:



    然后没加版本号的类会标黄,alt+Enter自动加:

    private static final long serialVersionUID = -392086972009226958L;
  • Parcelable

  1. 添加implements Parcelable

  2. 生成 (点类名:顺序不要动


  3. 使用:例如在activity传递

                Intent intent = new Intent(MainActivity.this,DetailActivity.class);
                Bundle bundle = new Bundle();
                bundle.putParcelable("studentObject", student);
                intent.putExtra("data", bundle);
                startActivity(intent);
  1. 获取:
        Intent intent = getIntent();
        Bundle bundle = intent.getBundleExtra("data");
        Student student =  bundle.getParcelable("studentObject");
        binding.textView2.setText(student.getName()); // 显示
  • Json

测试工具:




code - reformat code
转换例子,类和json对应就好,基础教程网上很多,不写了:

        final Student student = new Student("name",18,new Score(98,"a"));
        Gson gson = new Gson();
        String str = gson.toJson(student);
        String str1 = "{\"name\":\"name\",\"score\":{\"grade\":\"a\",\"math\":98}}";
        Student student1 = gson.fromJson(str1, Student.class);

支持列表:

        final Student student = new Student("name",18,new Score(98,"a"));
        final Student student1 = new Student("name1",181,new Score(981,"a1"));
        Student[] students = {student,student1};
        Gson gson = new Gson();
        String result = gson.toJson(students);

列表内为方括号



反序列化:

        Student[] students1 = gson.fromJson(str1, Student[].class);
        List<Student> list = Arrays.asList(students1);

或者list,结果和数组一样:

        final Student student = new Student("name",18,new Score(98,"a"));
        final Student student1 = new Student("name1",181,new Score(981,"a1"));
        List<Student> studentList = new ArrayList<>();
        studentList.add(student);
        studentList.add(student1);
        Gson gson = new Gson();
        String str = gson.toJson(studentList);
  • 注意,不能直接强制用List.class反序列到list,会出问题
    需要定义一个Type:
        Type typeStudent = new TypeToken<List<Student>>(){}.getType();
        List<Student> studentList = new ArrayList<>();
        studentList = gson.fromJson(str1,typeStudent);
  • 定义封装名字:
public class Student{
    @SerializedName("student_name")
    private String name;

这样出来的就是

  {
    "student_name": "name",
    "score": {
      "grade": "a",
      "math": 98
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。