静态变量能被序列化吗?

先解释下什么是序列化
我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术 。
Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将二进制数据保存到磁盘或者传输网络,磁盘或者网络接收者可以在对象的属类的模板上来反序列化类的对象,达到对象持久化的目的 。
更多序列化请参考:《关于Java序列化你应该知道的一切》这篇文章 。
什么是 ?
简单来说就是,被修饰的变量不能被序列化 。
具体来看下面的示例1
import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;/*** @author 微信公众号:Java技术栈*/public class TransientTest {public static void main(String[] args) throws Exception {User user = new User();user.setUsername("Java技术栈");user.setId("javastack");System.out.println("\n序列化之前");System.out.println("username: " + user.getUsername());System.out.println("id: " + user.getId());ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("d:/user.txt"));os.writeObject(user);os.flush();os.close();ObjectInputStream is = new ObjectInputStream(new FileInputStream("d:/user.txt"));user = (User) is.readObject();is.close();System.out.println("\n序列化之后");System.out.println("username: " + user.getUsername());System.out.println("id: " + user.getId());}}/*** @author 微信公众号:Java技术栈*/class User implements Serializable {private static final long serialVersionUID = 1L;private String username;private transient String id;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getId() {return id;}public void setId(String id) {this.id = id;}}
输出结果:
序列化之前username: Java技术栈id: javastack序列化之后username: Java技术栈id: null
示例1在 id 字段上加了关键字修饰,反序列化出来之后值为 null,说明了被修饰的变量不能被序列化 。
静态变量能被序列化吗?
这个话题也是最近栈长的Java技术栈vip群里面讨论的,大家对这个知识点比较模糊,我就写了这篇文章测试总结一下 。
如果你也想加入我们的Java技术栈vip群和各位大牛一起讨论技术,那点击这个链接了解加入吧 。
那么,到底静态变量能被序列化吗?废话少说,先动手测试下吧!
示例2:
import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;/*** @author 微信公众号:Java技术栈*/public class TransientStaticTest {public static void main(String[] args) throws Exception {User2 user = new User2();User2.username = "Java技术栈1";user.setId("javastack");System.out.println("\n序列化之前");System.out.println("username: " + user.getUsername());System.out.println("id: " + user.getId());ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("d:/user.txt"));os.writeObject(user);os.flush();os.close();// 在反序列化出来之前,改变静态变量的值User2.username = "Java技术栈2";ObjectInputStream is = new ObjectInputStream(new FileInputStream("d:/user.txt"));user = (User2) is.readObject();is.close();System.out.println("\n序列化之后");System.out.println("username: " + user.getUsername());System.out.println("id: " + user.getId());}}/*** @author 微信公众号:Java技术栈*/class User2 implements Serializable {private static final long serialVersionUID = 1L;public static String username;private transient String id;public String getUsername() {return username;}public String getId() {return id;}public void setId(String id) {this.id = id;}}