-
1. Serializable
流程:
- 带数据的类
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;
}
- 输出到文件
ObjectOutputStream objectOutputStream = new ObjectOutputStream(openFileOutput(FILE_NAME, MODE_PRIVATE));//覆盖
objectOutputStream.writeObject(student);
objectOutputStream.flush(); // 清空缓存
objectOutputStream.close();
- 读取:
ObjectInputStream objectInputStream = new ObjectInputStream(openFileInput(FILE_NAME));
Student student1 = (Student) objectInputStream.readObject();
- 关于 transient:
测试1:transient int型,读取后输出结果为0
测试2:transient Object型,可读取,输出报错,因为Object为null
测试3:transient String,可读取,输出为null
- 关于 transient:
-
注意事项
该接口会自动定义一个long型版本号,若数据结构发生改变,则以前保存的数据读取不出来,解决方法:人为添加版本号:
然后没加版本号的类会标黄,alt+Enter自动加:
private static final long serialVersionUID = -392086972009226958L;
-
Parcelable
添加
implements Parcelable-
生成 (点类名:顺序不要动
使用:例如在activity传递
Intent intent = new Intent(MainActivity.this,DetailActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable("studentObject", student);
intent.putExtra("data", bundle);
startActivity(intent);
- 获取:
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
}

