【校招VIP】JAVA面试题-序列化面试题

08月04日 收藏 0 评论 0 java开发

【校招VIP】JAVA面试题-序列化面试题

转载声明:原文链接:https://blog.csdn.net/qq_36154832/article/details/95636063  

什么是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();
}
}
}


C 0条回复 评论

帖子还没人回复快来抢沙发