1.序列化与反序列化是干什么的 都用哪些类处理
正常对象是保存在堆中的但你程序用完对象就结束了 但你还想用怎么办 你可以把对象持久化(就是保存在硬盘上) 处理类是ObjectInputStream与 OjbectOutputStream
2.当你序列化一个对象 但当你改变对象 就不能反序列化了
其实jvm是根据 static final long serialVersionUID = 42L; 这个字段是否相同来决定是否能反序列化的 这个字段又是系统生成的 如果你想
做到即使是改变对象也能序列化 就要自己生成serialVersionUID
3.什么属性不能序列化
static 属性不能 因为static 是方法区的 而序列化只能是堆中的数据 所以不能序列化
还有就是 ransient int age 也是不能序列化的因为有transient关键字
代码实例- public class ObjectInputStream {
- public static void main(String[] args) throws Exception {
- writeObj();
- readerObj();
- }
- public static void writeObj() throws Exception {
- ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:\\info.txt"));
- oos.writeObject(new Person("lisi", 39, "上海"));
- oos.close();
- }
- public static void readerObj() throws FileNotFoundException, Exception {
- java.io.ObjectInputStream ois = new java.io.ObjectInputStream(new FileInputStream("d:\\info.txt"));
- Person p = (Person) ois.readObject();
- System.out.println(p);
- ois.close();
- }
- }
复制代码 person pojo- public class Person implements Serializable {
- public static final long serialVersionUID = 42L;// 手动生成UID根据UID来标示一个类
- // 当你改变person同样能序列反序列
- private String name;
- private int age;// transient int age 也是不能序列化的因为有transient关键字
- static String work = "北京";// 不能被序列化因为 static是放在方法区的 而对象是放在堆总的 序列化只能序列堆的对象
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public static String getWork() {
- return work;
- }
- public static void setWork(String work) {
- Person.work = work;
- }
- public static long getSerialversionuid() {
- return serialVersionUID;
- }
- public Person(String name, int age, String work) {
- this.work = work;
- this.name = name;
- this.age = age;
- }
- @Override
- public String toString() {
- return "Person [name=" + name + ", age=" + age + ",work=" + work + "]";
- }
- }
复制代码 |