在scjp 1.6上看到这样一个例子,class dog中包含class collar,collar没有implement序列化并且被标transient. 现在要把dog对象序列化并且保存collar的变量size. 这时候需要用到签名,在class dog里分别写
private void writeObject(ObjectOutputStream os){
os.defaultWriteObject()
/等等/
}
private void readObect(ObjectInputStream is){
is.defaultReadObject()
/等等/
}我的问题是当我在main()中分别用到ObjectOutputStream和ObjectInputStream的时候,是否需要把main()的ObjectOutputStream对象和InputObjectStream对象的名字和class dog中private方法里的argument保持一致呢?简洁的说是不是也得让main()里头的ObjectOutputStream对象必须也叫os,ObjectInputStream对象必须也叫is。
谢谢。
private void writeObject(ObjectOutputStream os){
os.defaultWriteObject()
/等等/
}
private void readObect(ObjectInputStream is){
is.defaultReadObject()
/等等/
}我的问题是当我在main()中分别用到ObjectOutputStream和ObjectInputStream的时候,是否需要把main()的ObjectOutputStream对象和InputObjectStream对象的名字和class dog中private方法里的argument保持一致呢?简洁的说是不是也得让main()里头的ObjectOutputStream对象必须也叫os,ObjectInputStream对象必须也叫is。
谢谢。
问题解决了么?
不需要关联的话,那怎么实现签名
我刚好敲代码在这儿碰到了问题package serializable;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;@SuppressWarnings("serial")
public class User implements Serializable { private String name;
private transient String pwd; // 不参与序列化和反序列过程 public User(String name, String pwd) {
super();
this.name = name;
this.pwd = pwd;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
} public String toString() {
return "name" + name + ",password:" + pwd;
} /**
* 加密数组,将buff数组中的每个字节的每一位取反。
*/
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;
} /**
* 特殊序列化
*/
public void writeObject(ObjectOutputStream stream) throws IOException {
stream.defaultWriteObject(); // 先按默认方式序列化
stream.writeObject(change(pwd.getBytes())); // 再按自定义的方式序列化
} /**
* 特殊反序列化
*/
public void readObject(ObjectInputStream stream) throws IOException,
ClassNotFoundException {
stream.defaultReadObject(); // 先按默认方式反序列化
byte[] buff = (byte[]) stream.readObject(); // 再按自定义的方式反序列化
pwd = new String(change(buff));
} public static void main(String[] args) throws IOException,
ClassNotFoundException {
User user = new User("wei.chen", "123456");
System.out.println("before Serializable:" + user); ByteArrayOutputStream buf = new ByteArrayOutputStream(); // 把user序列化到一个数组
ObjectOutputStream oos = new ObjectOutputStream(buf);
oos.writeObject(user); // 从字节缓存中反序列化user对象
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(
buf.toByteArray()));
user = (User) ois.readObject();
System.out.println("after Serializable:" + user);
}
}
实现不了