transient关键字的对象是不参与序列化的,TreeSet中保存数据的变量m就是被transient修饰的,理论上是不被序列化的,但为什么反序列化后treeset还会有数据?
并不是说有transient关键字修饰的变量就一定不会被序列化,transient是针对系统来说的,此类中如果有自定义readObject和writeObject方法,方法中已经对transient变量作了序列化处理,那么还是可以被序列化的。
下面是例子,若没有read和write方法,那么变量a序列化完后会是0,若有则是序列化的值。
static class Bean implements Serializable {
private static final long serialVersionUID = 2966031808490167073L;
int x = -1, y = -1, z = -1;
transient int a = -1;
private void writeObject(ObjectOutputStream stream) throws IOException {
stream.writeInt(x);
stream.writeInt(y);
stream.writeInt(z);
stream.writeInt(a);
}
private void readObject(ObjectInputStream inputStream) throws IOException {
x = inputStream.readInt();
y = inputStream.readInt();
z = inputStream.readInt();
a = inputStream.readInt();
}
@Override
public String toString() {
return "Bean{" +
"x=" + x +
", y=" + y +
", z=" + z +
", a=" + a +
'}';
}
}
writeObject()方法最后不是有个循环嘛。