关于Class对象的序列化以及static变量的序列化. 谁讲讲,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 static是类共享的,当该类一个对象被序列化后,这个static变量可能会被另一个对象改变,所以这决定了静态变量是不能序列化的,但如果是final,就可以,因为这是一个常量 Class类实现了Serializable接口,thinking中提到将Class对象序列化,能够存储static值.大家试过没? 默认的序列化静态变量是不参与的若是想序列化和反序列化静态变量,可以让被序列化的类实现wrieObject(ObjectOuputStream )readObject(ObjectInputStream )把静态变量写入到输出流中,可以从输入流中读入 我测试过,static定义的变量序列化好像不对呀一直不知道是什么原因 大家试下把Class的实例进行序列化和反序列化,看看结果如何啊(关注static). 谁能讲讲Class这个类?我觉得这是关键. import java.io.*;public class Customer3 implements Serializable { private static int count; //用于计算Customer3对象的数目 private static final int MAX_COUNT=1000; private String name; private transient String password; static{ System.out.println("调用Customer3类的静态代码块"); } public Customer3(){ System.out.println("调用Customer3类的不带参数的构造方法"); count++; } public Customer3(String name, String password) { System.out.println("调用Customer3类的带参数的构造方法"); this.name=name; this.password=password; count++; } /** 加密数组,将buff数组中的每个字节的每一位取反 * 例如13的二进制为00001101,取反后为11110010 */ private byte[] change(byte[] buff){ for(int i=0;i<buff.length;i++){ int b=0; for(int j=0;j<8;j++){ int bit=(buff[i]>>j & 1)==0 ? 1:0; b+=(1<<j)*bit; } buff[i]=(byte)b; } return buff; } private void writeObject(ObjectOutputStream stream)throws IOException { stream.defaultWriteObject(); //先按默认方式序列化 stream.writeObject(change(password.getBytes())); stream.writeInt(count); } private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); //先按默认方式反序列化 byte[] buff=(byte[])stream.readObject(); password = new String(change(buff)); count=stream.readInt(); } public String toString() { return "count="+count +" MAX_COUNT="+MAX_COUNT +" name="+name +" password="+ password; }} en,楼上说的是一种解决方法.先谢谢.其实我很想知道将Class的实例反序列化时的处理.比如out.writeObject(Customer3.class);...in.readObject();core java中提到虚拟机确保系统中对不同class,都只有一个Class的实例.那上面的in.readObject()执行之后系统做了哪些操作? Ext作excel导出,始终不弹出下载对话框(程序不报错) 严重: 读取文件日志错误java.io.IOException: Couldn't get lock for ...\2012-02-03.log java中的方法重写,小弟新手 java命令行问题 项目给别人怎么用? 按钮想要显示图片,但是相对路径无效??还是我忽略了什么 如何设置程序运行的初始位置 关于IO流的问题 请教:如何实现点击一个image后,该image在Applet中移动位置?有示例代码吗?谢谢!!! 大神们来看看这是什么错误 Jar后:FileInputStream、配置文件 不能读入 java语法问题
thinking中提到将Class对象序列化,能够存储static值.
大家试过没?
若是想序列化和反序列化静态变量,可以让被序列化的类实现wrieObject(ObjectOuputStream )
readObject(ObjectInputStream )
把静态变量写入到输出流中,可以从输入流中读入
一直不知道是什么原因
public class Customer3 implements Serializable {
private static int count; //用于计算Customer3对象的数目
private static final int MAX_COUNT=1000;
private String name;
private transient String password;
static{
System.out.println("调用Customer3类的静态代码块");
}
public Customer3(){
System.out.println("调用Customer3类的不带参数的构造方法");
count++;
}
public Customer3(String name, String password) {
System.out.println("调用Customer3类的带参数的构造方法");
this.name=name;
this.password=password;
count++;
} /** 加密数组,将buff数组中的每个字节的每一位取反
* 例如13的二进制为00001101,取反后为11110010
*/
private byte[] change(byte[] buff){
for(int i=0;i<buff.length;i++){
int b=0;
for(int j=0;j<8;j++){
int bit=(buff[i]>>j & 1)==0 ? 1:0;
b+=(1<<j)*bit;
}
buff[i]=(byte)b;
}
return buff;
} private void writeObject(ObjectOutputStream stream)throws IOException {
stream.defaultWriteObject(); //先按默认方式序列化
stream.writeObject(change(password.getBytes()));
stream.writeInt(count);
} private void readObject(ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject(); //先按默认方式反序列化
byte[] buff=(byte[])stream.readObject();
password = new String(change(buff));
count=stream.readInt();
} public String toString() {
return "count="+count
+" MAX_COUNT="+MAX_COUNT
+" name="+name
+" password="+ password;
}
}
先谢谢.其实我很想知道将Class的实例反序列化时的处理.比如
out.writeObject(Customer3.class);...in.readObject();
core java中提到虚拟机确保系统中对不同class,都只有一个Class的实例.
那上面的in.readObject()执行之后系统做了哪些操作?