静态变量能被序列化吗?( 二 )


输出结果:
序列化之前username: Java技术栈1id: javastack序列化之后username: Java技术栈2id: null
示例2把改为了, 并在反序列化出来之前改变了静态变量的值,结果可以看出序列化之后的值并非序列化进去时的值 。
由以上结果分析可知,静态变量不能被序列化,示例2读取出来的是在 JVM 内存中存储的值 。
真不能被序列化吗?

静态变量能被序列化吗?

文章插图
继续来看示例3:
import java.io.Externalizable;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInput;import java.io.ObjectInputStream;import java.io.ObjectOutput;import java.io.ObjectOutputStream;/*** @author 微信公众号:Java技术栈*/public class ExternalizableTest {public static void main(String[] args) throws Exception {User3 user = new User3();user.setUsername("Java技术栈");user.setId("javastack");ObjectOutput objectOutput = new ObjectOutputStream(new FileOutputStream(new File("javastack")));objectOutput.writeObject(user);ObjectInput objectInput = new ObjectInputStream(new FileInputStream(new File("javastack")));user = (User3) objectInput.readObject();System.out.println(user.getUsername());System.out.println(user.getId());objectOutput.close();objectInput.close();}}/*** @author 微信公众号:Java技术栈*/class User3 implements Externalizable {private static final long serialVersionUID = 1L;public User3() {}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;}@Overridepublic void writeExternal(ObjectOutput objectOutput) throws IOException {objectOutput.writeObject(id);}@Overridepublic void readExternal(ObjectInput objectInput) throws IOException, ClassNotFoundException {id = (String) objectInput.readObject();}}
输出结果:
nulljavastack
示例3的 id 被修改了,为什么还能序列化出来?那是因为 User3 实现了接口 ,而不是。
在 Java 中有两种实现序列化的方式,和 ,可能大部分人只知道而不知道。
这两种序列化方式的区别是:实现了接口是自动序列化的,实现则需要手动序列化,通过和方法手动进行,这也是为什么上面的为 null 的原因了 。
关键字总结
1)修饰的变量不能被序列化;
【静态变量能被序列化吗?】2)只作用于实现接口;
3)只能用来修饰普通成员变量字段;
4)不管有没有修饰,静态变量都不能被序列化;