java_IO--对象序列化

内容学习于:edu.aliyun.com


1. 对象序列化基本概念

  所谓的对象序列化指的是将内存中保存的对象以二进制数据流的形式进行处理,可以实现对象的保存或者是网络传输。
如下图所示:

  然而并不是所有的对象都可以被序列化,在Java里面有一个强制性的要求:如果要序列化的对象,那么对象所在的类一定要实现java.io.Serializable父接口,作为序列化的标记,这个接口并没有任何的方法,因为它描述的是一种类的能力。

可以被序列化的类:

class Person implements Serializable {//可以被序列化
    private String name ;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

2. 序列化与反序列化处理

类名称 类定义 构造方法 操作方法
ObjectOutputStream public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants public ObjectOutputStream(OutputStream out) throws IOException public final void writeObject(Object obj) throws IOException
ObjectInputStream public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants public ObjectInputStream(InputStream in) throws IOException public final Object readObject() throws IOException,ClassNotFoundException

序列化和反序列化代码:

class Person implements Serializable {//可以被序列化
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}


public class JavaAPIDemo {
    private static final File SAVE_FILE = new File("d:" + File.separator + "mldn.person");

    public static void main(String[] args) throws Exception {
        savaObject(new Person("张三", 25));
        System.out.println(loadObject());
    }

    public static void savaObject(Object obj) throws Exception {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(SAVE_FILE));
        oos.writeObject(obj);//序列化
        oos.close();
    }

    public static Object loadObject() throws Exception {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(SAVE_FILE));
        Object obj = ois.readObject();//反序列化
        ois.close();
        return obj;
    }

}

结果:

Person{name=‘张三’, age=25}

  在Java中的对象序列化与反序列化必须使用内部提供的对象操作流,因为这里面牵扯到二进制数据的格式所以不能够自定义处理,另外如果要想实现–组对象的序列化,则可以使用对象数组完成。
  在很多的实际项目开发过程之中,开发者很少能够见到ObjectOutputStream、ObjectInputStream 类的直接操作,因为会有一些容器帮助开发者自动实现。

3. transient关键字

  默认情况下当执行了对象序列化的时候会将类中的全部属性的内容进行全部的序列化操作,但是很多情况下有一些属性可能并不需要进行序列化的处理,这个时候就可以在属性定义上使用transient关键字来完成了。

private transient String name;

  在进行序列化处理的时候name属性的内容是不会被保存下来的,换言之,读取的数据name将是其对应数据类型的默认值“null”。如果假设类之中有一些是需要计算保存的属性内容往往是不需要被序列化的,这个时候就可以使用transient,但是在实际的开发之中大部分需要被序列化的类往往都是简单java类,所以这一个关键字的出现频率并不高。

全部评论

相关推荐

2025-12-21 21:22
安徽农业大学 运营
程序员花海:实习和校招简历正确格式应该是教育背景+实习+项目经历+个人评价 其中项目经历注意要体现业务 实习经历里面的业务更是要自圆其说 简历模板尽可能保持干净整洁 不要太花哨的
实习简历求拷打
点赞 评论 收藏
分享
当年还在美团那个倒霉的 Peppr 团队工作时,我一直有个疑问:这群人每天到底在自嗨什么。每次开会一堆人围着一堆“看起来很高级”的文档转,模板统一、名词复杂、页数感人,每一页都在暗示一件事:“你不懂,是因为你不专业。”但现实是——代码照样写在 💩 山上,该出问题还是会出问题,这真的很逗,系统一出问题,文档的唯一作用就是证明:“我们当初确实认真写过文档。”所以本质区别到底是什么?是代码质量提升了,还是大家在精神层面完成了一次“工程师 cosplay”?有句话说得好潮水退去才知道谁在裸泳。还记得当时的马哥、明哥(图 1 左)最爱反复强调一句话:“所有场景一定要想到。”、“这个场景为什么没考虑到?”不过他们这些话我是真的听进去了。不然我也不会在一年多前就说:这个项目活不过两年。顺带一提,那段时间还有个固定节目。每次下楼,总能听见我明哥在吐槽不同的人。我从他身后绕过去,经常能听到他一边抽烟一边说:“xx 这小子太坑了,回头我一定要跟马哥说说。”于是深谙人情世故但真不会抽烟的我也会从口袋掏出一支低尼古丁含量的烟给自己点上,假意自己什么都没听到什么都不知道,只是来抽烟的。后来我才明白,这可能也是团队文化的一部分:问题永远在别人身上,而我们,永远在复盘里😂。
秋招白月光
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务