Java如何实现序列化,有什么意义?
1.实现序列化:
1)让类实现Serializable接⼝,该接⼝是⼀个标志性接⼝,标注该类对象是可被序列
2)然后使⽤⼀个输出流来构造⼀个对象输出流并通过writeObect(Obejct)⽅法就可以将实现对象写出
3)如果需要反序列化,则可以⽤⼀个输⼊流建⽴对象输⼊流,然后通过readObeject⽅法从流中读取对象
2.作⽤:
1)序列化就是⼀种⽤来处理对象流的机制,所谓对象流也就是将对象的内容进⾏流化,可以对流化后的对象进⾏读写操作,也可以将流化后的对象传输与⽹络之间;
2)为了解决对象流读写操作时可能引发的问题(如果不进⾏序列化,可能会存在数据乱序的问题)
3)序列化除了能够实现对象的持久化之外,还能够⽤于对象的深度克隆
上⾯说的很抽象,接下来看例⼦ 具体点:
第⼀步:创建⼀个 JavaBean 对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26public class Person implements Serializable{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return"Person [name="+ name + ", age="+ age + "]";
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
第⼆步:使⽤ ObjectOutputStream 对象实现序列化
1 2 3
4 5 6//在根⽬录下新建⼀个 io 的⽂件夹
OutputStream op = new FileOutputStream("io"+File.separator+"a.txt");
ObjectOutputStream ops = new ObjectOutputStream(op);
ops.writeObject(new Person("vae",1));
ops.close();
我们打开 a.txt ⽂件,发现⾥⾯的内容乱码,注意这不需要我们来看懂,这是⼆进制⽂件,计算机能读懂就⾏了。
错误⼀:如果新建的 Person 对象没有实现 Serializable 接⼝,那么上⾯的操作会报错:
第三步:使⽤ObjectInputStream 对象实现反序列化
反序列化的对象必须要提供该对象的字节码⽂件.class
1 2 3 4 5 6 7InputStream in = new FileInputStream("io"+File.separator+"a.txt");
ObjectInputStream os = new ObjectInputStream(in);
byte[] buffer = new byte[10];
int len = -1;
Person p = (Person) os.readObject();
System.out.println(p); //Person [name=vae, age=1]
os.close();
问题1:如果某些数据不需要做序列化,⽐如密码,⽐如上⾯的年龄?解决办法:在字段⾯前加上 transient
1 2private String name;//需要序列化
transient private int age;//不需要序列化
那么我们在反序列化的时候,打印出来的就是Person [name=vae, age=0],整型数据默认值为 0
javabean是干什么的问题2:序列化版本问题,在完成序列化操作后,由于项⽬的升级或修改,可能我们会对序列化对象进⾏修改,⽐如增加某个字段,那么我
们在进⾏反序列化就会报错:
解决办法:在 JavaBean 对象中增加⼀个 serialVersionUID 字段,⽤来固定这个版本,⽆论我们怎么修改,版本都是⼀致的,就能进⾏反序列化了
1private static final long serialVersionUID = 8656128222714547171L;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论