Java序列化

Wesley13
• 阅读 613

在java中序列化对象需要实现一个接口,表示该对象可以被序列化

java.io.Serializable

接下来介绍一个关键字

transient

这个关键字的意思就是取反:

如果一个对象实现了Serializable接口,加上这个关键字表示这个对象不能被序列化;

如果一个对象没有实现Serializable接口,加上这个关键字表示这个对象可以被序列化,同时需要告诉虚拟机应该如何序列化,在类的内部写两个方法。

// 注:这些方法定义时必须是私有的,因为不需要你显示调用,序列化机制会自动调用的
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
private void writeObject(ObjectOutputStream out) throws IOException;

栗子:

Java序列化

完整栗子:

package top.swimmer.tokenizer;

import java.time.LocalDateTime;

public class Foo {
    private String a;
    private LocalDateTime time;

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

    public LocalDateTime getTime() {
        return time;
    }

    public void setTime(LocalDateTime time) {
        this.time = time;
    }

    public Foo() {
        a = "Hello world!";
        time = LocalDateTime.now();
    }
}


package top.swimmer.tokenizer;

import java.io.Closeable;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.time.LocalDateTime;

public class Too implements Serializable, Closeable {
    private transient Foo foo; // Foo没有实现Serializable接口,但是加了transient关键字就可以被序列化了
    private String c;

    public Too() {
        c = "Good man!";
        foo = new Foo();
    }

    @Override
    public void close() throws IOException {
        System.out.println("too close");
    }

    // 要写两个方法供虚拟机调用,分别告诉虚拟机对于Foo对象如何写,如何读
    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        out.writeObject(foo.getA());
        out.writeObject(foo.getTime());
    }

    private void readObject(ObjectInputStream input) throws IOException, ClassNotFoundException {
        input.defaultReadObject();
        Foo foo = new Foo();
        foo.setA((String) input.readObject());
        foo.setTime((LocalDateTime) input.readObject());
        this.foo = foo;
    }
}


package top.swimmer.tokenizer;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class ObjectDemo {
    public static void main(String[] args) throws Exception {
        Too t = new Too();
        File file = new File(ObjectDemo.class.getResource("/aaa.json").getFile());

        ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(file));
        output.writeObject(t);
        ObjectInputStream input = new ObjectInputStream(new FileInputStream(file));
        Too t1 = (Too) input.readObject();
        System.out.println();
    }
}
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
java集合框架
ArrayList简介ArrayList是list接口的可变数组的实现。与一般数组不同的是,它的容量可以动态增长。ArrayList继承了AbstractList抽象类,实现了List,RandomAccess,Cloneable,java.io.Serializable接口,根据实现的接口看,它支持随机访问,支持克隆,支持序列化
Wesley13 Wesley13
2年前
java中的序列化
一、什么是java序列化  序列化:将对象写入IO流反序列化:从IO流中恢复对象序列化机制允许将实现序列化的java对象转换为字节序列,这些字节序列可以保存在磁盘上也可以通过网络传输,字节序列也可以再恢复为原来的对象。序列化机制可以让对象不依附于程序独立存在。二、应用场景
Wesley13 Wesley13
2年前
javaBean为什么要implements Serializable
一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的。因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。而实际上,Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。    什么情况下需要序列化:    1.     当
Wesley13 Wesley13
2年前
FastJson、Jackson、Gson进行Java对象转换Json的细节处理
Java对象转换Json的细节处理前言Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式一、fastJson1、fastJson在转换java对象为json的时候,默认是不序列化nu
Wesley13 Wesley13
2年前
IOS中对象序列化与反序列化
概述在IOS中,对象的序列化和反序列化分别使用NSKeyedArchiver和NSKeyedUnarchiver两个类,我们可以把一个类对象进行序列化然后保存到文件中,使用时再读取文件,把内容反序列化出来。这个过程通常也被称为对象的编码(归档)和解码(解档)。需要注意的是,NSKeyedArchiver和NSKeyedUnarchiver是继
Easter79 Easter79
2年前
String、StringBuffer、StringBuilder源码解析
String源码分析一:实现接口。publicfinalclassString  implementsjava.io.Serializable,Comparable<String,CharSequence{java.io.Serializable    这个序列化接口没有任何方法和域,仅
Wesley13 Wesley13
2年前
Java序列化——transient关键字和Externalizable接口
  提到Java序列化,相信大家都不陌生。我们在序列化的时候,需要将被序列化的类实现Serializable接口,这样的类在序列化时,会默认将所有的字段都序列化。那么当我们在序列化Java对象时,如果不希望对象中某些字段被序列化(如密码字段),怎么实现呢?看一个例子:import java.io.Serializable;imp
Wesley13 Wesley13
2年前
unity将 -u4E00 这种 编码 转汉字 方法
 unity中直接使用 JsonMapper.ToJson(对象),取到的字符串,里面汉字可能是\\u4E00类似这种其实也不用转,服务器会通过类似fastjson发序列化的方式,将json转对象,获取对象的值就是中文但是有时服务器要求将传参中字符串中类似\\u4E00这种转汉字,就需要下面 publ
Wesley13 Wesley13
2年前
Java并发编程:Java 序列化的工作机制
JDK内置同步器的实现类经常会看到java.io.Serializable接口,这个接口即是Java序列化操作,这样看来序列化也是同步器的一种机制。 关于序列化本文主要分析Java中的序列化机制,并看看AQS同步器的序列化,掌握序列化机制才能完整理解JDK内置的同步工具的实现。在程序中为了能直接以Java对象的形式进行保存,然后再
Wesley13 Wesley13
2年前
JAVA中,序列化接口的作用
Java规定的内部机制,实现Serializable接口就行了,这个接口只是个标记性的接口,表示类的设计者已经允许这个类型的对象被序列化写入磁盘或通过网络发送,对于有保密要求的东西一般不实现这个接口防止无意间复制到jvm内存之外。如果一个类型的多数字段可以复制但个别字段不用复制(比如,它实际上是通过其它字段计算出来的),我们可以把它标记为