java中static、transient修饰的属性不能被序列化
相关网页:Java序列化的高级认识http://www.360doc.com/content/13/0728/18/13247663_303173972.shtml
以下程序来自”http://bbs.csdn.net/topics/390155251“(已验证)
类Student1
package test;
import java.io.Serializable;
public class Student1 implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private transient String password;
private static int count = 0;
public Student1(String name,String password){
System.out.println("调用Student的带参构造方法 ");
this.name = name;
this.password = password;
count++;
}
public String toString(){
return "人数:" + count + "姓名:" + name + "密码:" + password;
}
}
类ObjectSerTest1
package test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ObjectSerTest1 {
public static void main(String args[]){
try{
FileOutputStream fos = new FileOutputStream("test.obj");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Student1 s1 = new Student1("张三","123456");
Student1 s2 = new Student1("王五","56");
oos.writeObject(s1);
oos.writeObject(s2);
oos.close();
FileInputStream fis = new FileInputStream("test.obj");
ObjectInputStream ois = new ObjectInputStream(fis);
Student1 s3 = (Student1) ois.readObject();
Student1 s4 = (Student1) ois.readObject();
System.out.println(s3);
System.out.println(s4);
ois.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
}
}
运行结果:
调用Student的带参构造方法
调用Student的带参构造方法
人数:2姓名:张三密码:null
人数:2姓名:王五密码:null
类Test1
package test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Test1{
public static void main(String args[]){
try {
FileInputStream fis = new FileInputStream("test.obj");
ObjectInputStream ois = new ObjectInputStream(fis);
Student1 s3 = (Student1) ois.readObject();
Student1 s4 = (Student1) ois.readObject();
System.out.println(s3);
System.out.println(s4);
ois.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
}
}
运行结果:
人数:0姓名:张三密码:null
人数:0姓名:王五密码:null
类ObjectSerTest1 的运行结果显示count=2,似乎被序列化了,但是类Test1的运行结果显示count=0并未被序列化。
”序列化保存的是对象的状态,静态变量数以类的状态,因此序列化并不保存静态变量。
这里的不能序列化的意思,是序列化信息中不包含这个静态成员域
ObjectSerTest1测试成功,是因为都在同一个机器(而且是同一个进程),因为这个jvm已经把count加载进来了,所以你获取的是加载好的count,如果你是传到另一台机器或者你关掉程序重写写个程序读入test.obj,此时因为别的机器或新的进程是重新加载count的,所以count信息就是初始时的信息。“-----来自参考网页
重写类Test1读取test.obj显示的结果是count的初始时的信息,也验证了上面一段话。
最后,Java对象的static,transient 修饰的属性不能被序列化。
相关推荐
spring-data-redis RedisTemplate 操作redis时发现存储在redis中的key不是设置的string值,前面还多出了许多类似\xac\xed\x00\x05t\x00;