JAVA面试题-什么是java序列化,如何实现java序列化,Serializable接口的作用

JAVA面试题-什么是java序列化,如何实现java序列化,Serializable接口的作用

什么是java序列化

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

如何实现java序列化

需要被序列化的类必须实现Serializable接口。一个接口里面什么内容都没有,我们可以将它理解成一个标识接口。在Java中的这个Serializable接口其实是给jvm看的,通知jvm,我不对这个类做序列化了,你(jvm)帮我序列化就好了。

Serializable接口的作用

在web开发中,如果对象被保存在了Session中,tomcat在重启时要把Session对象序列化到硬盘,这个对象就必须实现Serializable接口。如果对象要经过分布式系统进行网络传输或通过rmi等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现Serializable接口。

为什么要定义serialversionUID变量

从接口说明可以看到:如果我们没有自己声明一个serialVersionUID变量,接口会默认生成一个serialVersionUID。但是默认的serialVersinUID对于class的细节非常敏感,反序列化时可能会导致InvalidClassException这个异常。

案例

我们可以通过调用ObjectOutputStream对象的writeObject()方法来将一个java对象变成字节流的形式传出去,还可以通过调用ObjectInputStream对象的readObject()方法来从一个字节流中恢复成一个java对象。但是被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。

public class User implements Serializable {

private static final long serialVersionUID = 64161316464L;

private int age;

private String name;

//略去setter getter&toString

}

public class SerializedUser {

public static void main(String[] args) {

test1();

test2();

}

private static void test2() {

try (ObjectInputStream is = new ObjectInputStream(new FileInputStream("C:/wxp.txt"))) {

User temp = (User) is.readObject();

System.out.println(temp);

} catch (IOException | ClassNotFoundException e) {

e.printStackTrace();

}

}

private static void test1() {

User user = new User();

user.setAge(16);

user.setName("Jin");

try (ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("C:/wxp.txt"))) {

os.writeObject(user);

} catch (IOException e) {

e.printStackTrace();

}

}

}

相关推荐

为什么狗狗大便前要转圈狗狗?大便前转圈的原因有哪些?
日博365官网网址多少

为什么狗狗大便前要转圈狗狗?大便前转圈的原因有哪些?

📅 08-10 👁️ 2379
𬤇的意思,𬤇的解释,𬤇的拼音,𬤇的部首
日博365官网网址多少

𬤇的意思,𬤇的解释,𬤇的拼音,𬤇的部首

📅 07-28 👁️ 1169
鱼缸水草哪种好养?养鱼新手闭着眼也能养活的水草
日博365官网网址多少

鱼缸水草哪种好养?养鱼新手闭着眼也能养活的水草

📅 08-04 👁️ 8740