前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中序列化与反序列化笔记

Java中序列化与反序列化笔记

作者头像
lzw-723
发布2022-08-14 11:06:23
3780
发布2022-08-14 11:06:23
举报
文章被收录于专栏:lzw-723's blog

Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。

概念

将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。

整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。

实现

方法

ObjectInputStreamObjectOutputStream 是高层次的数据流,它们包含反序列化和序列化对象的方法。

代码语言:javascript
复制
public final void writeObject(Object x) throws IOException

writeObject方法序列化一个对象,并将它发送到输出流。

相似的 ObjectInputStream 类包含如下反序列化一个对象的方法:

代码语言:javascript
复制
public final Object readObject() throws IOException, ClassNotFoundException

readObject方法从流中取出下一个对象,并将对象反序列化。它的返回值为Object,因此,你需要将它转换成合适的数据类型。

请注意,一个类的对象要想序列化成功,必须满足两个条件:

  • 该类必须实现 java.io.Serializable 接口。
  • 该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的。

如果你想知道一个 Java 标准类是否是可序列化的,请查看该类的文档。检验一个类的实例是否能序列化十分简单, 只需要查看该类有没有实现*java.io.Serializable*接口。

当序列化一个对象到文件时, 按照 Java 的标准约定是给文件一个 .ser 扩展名。 对于一个实体类,不想将所有的属性都进行序列化,有专门的关键字 transient

代码语言:javascript
复制
private transient String name;

当对该类序列化时,会自动忽略被 transient 修饰的属性。

代码

代码语言:javascript
复制
/**
 * 序列化测试
 *
 */
public class App {
    /**
     * Person
     */
    public static class Person implements Serializable {

        private String name;
        private int age;
        private transient String info = "nothing";

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

        public Person setInfo(String info) {
            this.info = info;
            return this;
        }
        public void show(){
            System.out.println(name + '-' + age + '-' + info);
        }
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        writePerson();
        readPerson();
    }

    // 从文件中读取Person对象
    public static void readPerson() throws IOException, ClassNotFoundException {
        // 创建反序列化流
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("\\dls.ser"));
        // 从文件中读取对象
        Object obj = ois.readObject();
        ((Person) obj).show();
        // 释放资源
        ois.close();
    }

    // 向文件中写Person对象
    public static void writePerson() throws IOException {
        // 创建序列化流
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("\\dls.ser"));
        // 向文件中写Person对象
        oos.writeObject(new Person("大老师", 17).setInfo("没有期望就没有失望,没有羁绊就不会受伤。"));
        // 关流
        oos.close();
    }
}

输出

大老师-17-null

参考资料

Java 序列化 | 菜鸟教程

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概念
  • 实现
    • 方法
      • 代码
        • 输出
        • 参考资料
        相关产品与服务
        文件存储
        文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档