0
2 classes DOG and Collar 

狗有一个不可序列化的项圈

Collar 有 String 和 int

问题:如何序列化 DOG 对象?尝试覆盖 writeObject 和 readObject 但在写入领子的 String 成员时卡住了如何编写和读取它?

这是2个班

import java.io.*;

public class Dog implements Serializable{

String name;
transient Collar c;

public Dog(String name, Collar c){
    this.name = name;
    this.c =c;

}

public static void main(String args[]){

    Dog d = new Dog("DogsName",new Collar("CollarsColor",3));


    try {
        File f = new File("dogs.ser");
        FileOutputStream fos = new FileOutputStream(f);
        ObjectOutputStream oos = new ObjectOutputStream(fos);

        oos.writeObject(d);
        oos.flush();
        oos.close();



        FileInputStream fis = new FileInputStream(f);
        ObjectInputStream ois = new ObjectInputStream(fis);


        Dog d2 =(Dog)ois.readObject();

        System.out.println(d2);
        ois.close();

    }
    } catch (Exception e) {

        e.printStackTrace();
    }


}

}   


public class Collar {
String color;
int size;

public Collar(){        
    color= "White";
    size =10;
}

public Collar(String c,int s){
    color =c;
    size =s;
}

} 
4

2 回答 2

0

由于字段“c”被标记为瞬态,它将在序列化时传递。使该字段可序列化的最快方法是让 Collar 类实现 Serializable 接口。由于 Collar 类只包含一个 String 和一个 int,所以它被序列化是没有问题的。

如果您希望将 Collar 类型的“c”字段保持为瞬态,同时仍对其状态进行序列化,您可以为 Collar 的数据成员添加 getter 方法,并将 readObject 和 writeObject 方法添加到Dog类,如下所示:

private void writeObject(ObjectOutputStream os) {
  try {
    os.defaultWriteObject();
    os.writeInt(c.getSize());
    os.writeObject(c.getColor());
  } catch (Exception e) {
    // handle exception
  }
}

private void readObject(ObjectInputStream is) {
  try {
    is.defaultReadObject();
    int collarSize = is.readInt();
    String collarColor = (String) is.readObject();
    this.c = new Collar(collarColor, collarSize);
  } catch (Exception e) {
    // handle exception
  }
}
于 2013-07-16T15:15:39.890 回答
0

如果成员是瞬态的,则它不是序列化的一部分。所以你失去了你的衣领参考。如果您也想对其进行序列化,请删除瞬态并使 Collar 类也实现 Serializable。

我不是 100% 确定,但是如果你使用序列化,你应该总是有一个默认的构造函数,因为 java 必须创建一个没有任何参数的类的实例

于 2013-07-16T15:06:59.973 回答