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;
}
}
答案 0 :(得分:0)
如果成员是瞬态的,则它不是序列化的一部分。所以你放松了你的衣领参考。如果你想序列化它,也要删除瞬态并让Collar类实现Serializable。
我不是百分百肯定,但是如果你使用序列化,你应该总是有一个默认的构造函数,因为java必须创建一个没有任何参数的类的实例
答案 1 :(得分: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
}
}