在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。
谢谢。

解决方案 »

  1.   

    不需要。其实你没理解writeObject和readObect的作用http://freish.iteye.com/admin/blogs/1007362
      

  2.   

    多谢,主要是一般书上都没有讲到这个,第一次在scjp的书上看到,有点陌生。请问是不是碰到这种情况在main()还是按照正常的ObjectOutputStream关联到FileOutputStream这样默认的序列化写法,唯一改变只是在你想序列化的类中加入private void WriteObject()和private void ReadObject()方法?
      

  3.   

    这...
    问题解决了么?
    不需要关联的话,那怎么实现签名
    我刚好敲代码在这儿碰到了问题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);
    }
    }
    实现不了