序列化瞬态字段(字段有字符串)

时间:2013-07-16 14:56:06

标签: java serialization

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;
}

} 

2 个答案:

答案 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
  }
}