1、什么是序列化?
序列化指的是将实例化的对象转化为字节流,反序列化指的是将字节流还原为原先的对象。有点像《三体》里边生命脱水后变成一张图片,然后又能还原成活生生的生命。
2、为什么要序列化?
(1)、序列化后,对象的信息转化为字符流,便于网络间对象的传输。
(2)、可以实现对象的持久化。
3、怎么序列化?
public class Person implements Serializable
{
/**
*
*/
private static final long serialVersionUID = 1L;
transient private String name;
private int age = -1;
private String sex;
private static Integer height = 180;
public String toString()
{
StringBuffer sb = new StringBuffer();
sb.append("name:" + name);
sb.append("age:" + age);
sb.append("sex:" + sex);
sb.append("height:" + height);
return sb.toString();
}
public static void main(String[] args) throws Exception
{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("F:\\\\person1.obj"));
oos.writeObject(new Person("小明", 15, "男", 170));
oos.close();
ObjectInputStream ors = new ObjectInputStream(new FileInputStream("F:\\\\person1.obj"));
Person person1 = (Person) ors.readObject();
System.out.println(person1.toString());
}
public static Integer getHeight()
{
return height;
}
public static void setHeight(Integer height)
{
Person.height = height;
}
public Person(String name, int age, String sex, Integer height)
{
this.name = name;
this.age = age;
this.sex = sex;
this.height = height;
}
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;
}
public String getSex()
{
return sex;
}
public void setSex(String sex)
{
this.sex = sex;
}
}
(1)、类的对象要想序列化,这个类必须继承Serializable(还有其他几种方式,先暂时不提)。
Serializable是一个空的接口,源码里边没有声明任何方法。
(2)、序列化代码:
public static void main(String[] args) throws Exception
{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("F:\\\\person1.obj"));
oos.writeObject(new Person("小明", 15, "男", 170));
oos.close();
ObjectInputStream ors = new ObjectInputStream(new FileInputStream("F:\\\\person1.obj"));
Person person1 = (Person) ors.readObject();
System.out.println(person1.toString());// name:nullage:15sex:男height:170
}
(3)、transient修饰的成员变量不会被序列化和反序列化。
(4)、看网上的资料说static修饰的属性是类的属性,被对象共享,因此也不会被序列化;但是实际测试,
发现height:170,说明被序列化了,此处还有待继续研究。。