博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java序列化
阅读量:5135 次
发布时间:2019-06-13

本文共 3956 字,大约阅读时间需要 13 分钟。

   关于序列化的文字已经是汗牛充栋了,这里我就讲一下我个人理解到的java序列化.

   什么是序列化?

     序列化是将对象变成一连串的字节的过程,反序列化就是把一连串字节变成对象的过程.

   什么情况下需要序列化

      希望把对象变成文件和数据库数据的时候

     在网络上以套接字的方式传输的时候

     通过RIM远程传输对象的时候

   首先,要理解为什么要用到序列化?如果我们有需要把对象永久的保存起来,就可以把java对象序列化文件,当需要的时候就可以反序列化成对象使用.

   java类实现序列化接口Serializable,这个类就可以实现序列化了

   代码实现序列化

  创建一个普通类

package org.fkjava.oa.base;import java.io.Serializable;public class Chen implements Serializable{    private String name;    private int age;    public Chen(){        System.out.println("无参");    }        public Chen(String name,int age){        System.out.println("有参");        this.name = name;        this.age = age;    }    @Override    public String toString(){                return "[" + name + " " + age + "]";    }    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;    }}

序列化和反序列代码

package org.fkjava.oa.base;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;public class Jia {    public static void main(String[] args) throws Exception {        File file = new File("a.out");        ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(file));        Chen chen = new Chen("chen",19);        oo.writeObject(chen);        System.out.println("--------");        ObjectInputStream oi = new ObjectInputStream(new FileInputStream(file));        Chen c = (Chen) oi.readObject();        System.out.println(c);    }}

可以看出,反序列的时候,没有调用对象的无参构造函数

看看writeObject()代码到底做了什么

............// remaining cases            if (obj instanceof String) {                writeString((String) obj, unshared);            } else if (cl.isArray()) {                writeArray(obj, desc, unshared);            } else if (obj instanceof Enum) {                writeEnum((Enum) obj, desc, unshared);            } else if (obj instanceof Serializable) {                writeOrdinaryObject(obj, desc, unshared);            } else {                if (extendedDebugInfo) {                    throw new NotSerializableException(                        cl.getName() + "\n" + debugInfoStack.toString());                } else {                    throw new NotSerializableException(cl.getName());                }            }..........

可以看出只要是string,数组,枚举和实现了Serializable

 

如果希望某个属性不被序列化的,需要怎么做呢.

使用transient

package org.fkjava.oa.base;import java.io.Serializable;public class Chen implements Serializable{    private String name;    private transient int age;    public Chen(){        System.out.println("无参");    }        public Chen(String name,int age){        System.out.println("有参");        this.name = name;        this.age = age;    }    @Override    public String toString(){                return "[" + name + " " + age + "]";    }    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;    }}

如果不去掉transient,但是又想把对象的属性序列化到文件,怎么做呢.

private void writeObject(ObjectOutputStream oo) throws IOException{        System.out.println("write");        oo.defaultWriteObject();        oo.writeInt(age);    }    private void readObject(ObjectInputStream oi) throws IOException, ClassNotFoundException{        System.out.println("read");        oi.defaultReadObject();        int age = oi.readInt();    }

当序列化和反序列化对象的时候,默认是调用对象的writeObject和readObject方法,但是他们都是private,怎么调用你,明显是使用了反射.

如果实现序列化单例,当时反序列化出来的对象就不是单例了,这时候怎么办

private Object readResolve(){        System.out.println("redResolve");        return Chen.getInstance();    }

ObjectInputStream会提供一个方法readResolve,只要实现了这个方法,用户在设置返回的对象,这个对象就作为readObject返回的对象,如果没有实现,系统默认选取

writeObject的对象.

转载于:https://www.cnblogs.com/homesea/p/4719296.html

你可能感兴趣的文章
团队开发之个人博客八(4月27)
查看>>
发布功能完成
查看>>
【原】小程序常见问题整理
查看>>
C# ITextSharp pdf 自动打印
查看>>
【Java】synchronized与lock的区别
查看>>
django高级应用(分页功能)
查看>>
【转】Linux之printf命令
查看>>
关于PHP会话:session和cookie
查看>>
STM32F10x_RTC秒中断
查看>>
display:none和visiblity:hidden区别
查看>>
C#double转化成字符串 保留小数位数, 不以科学计数法的形式出现。
查看>>
牛的障碍Cow Steeplechase
查看>>
Zookeeper选举算法原理
查看>>
3月29日AM
查看>>
利用IP地址查询接口来查询IP归属地
查看>>
HTML元素定义 ID,Class,Style的优先级
查看>>
构造者模式
查看>>
http和https的区别
查看>>
Hbuild在线云ios打包失败,提示BuildConfigure Failed 31013 App Store 图标 未找到 解决方法...
查看>>
找到树中指定id的所有父节点
查看>>