1.序列化的对象
/**
*
* @author lm 说明:1.序列化不会保存静态变量,因为静态变量是对象的状态 2.Transient 不会被序列化 因为Transient 是临时变量
*
*/
public class Model implements Serializable {
//L表示long ,long占用8个字节,表示范围:-9223372036854775808 ~ 9223372036854775807,1L就是1。
private static final long serialVersionUID = 1L;private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.序列化 属于test类
/**
*
* @param m
* 要序列化的对象
* @return byte[] 序列化后的字节数组
*/
public byte[] tobyte(Model m) {
// 设置属性
m.setAge(10);
m.setName("小明");
// 输出流ByteArrayOutputStream是跟字节交互的
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 输出流 ObjectOutputStream 是跟对象交互的 可以吧对象转换成ByteArrayOutputStream输出流
ObjectOutputStream oos;
byte[] bytes = null;
try {
oos = new ObjectOutputStream(baos);
oos.writeObject(m);
bytes = baos.toByteArray();
oos.close();
System.out.println("序列化的数据 是字节数组:" + bytes);
} catch (Exception e) {
e.printStackTrace();
}
return bytes;
}
3.返序列化 属于test类
/**
*
* 把序列化的字节数组 返序列化成对象
*
* @param byte[] 序列化后的字节数组
*
* @return Model
*/
public Model frombyte(byte[] bytes) {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois;
Model retModel = null;
try {
ois = new ObjectInputStream(bais);
bais.close();
retModel = (Model) ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}
return retModel;
}
4.测试
public static void main(String[] args) {
Model model = new Model();
model.setAge(18);
model.setName("那个她");
test test=new test();
byte [] rbytes=test.tobyte(model);
System.out.println("序列化后的字节数组:"+rbytes);
Model m2= test.frombyte(rbytes);
System.out.println("反序列化后对象:"+m2.getAge()+"--"+m2.getName());
}
最后总结一下:其实序列化的作用是能转化成Byte流,然后又能反序列化成原始的类。能在网络进行传输,也可以保存在磁盘中,有了SUID(private static final long serialVersionUID = 1L)之后,那么如果序列化的类已经保存了在本地中,中途你更改了类后,SUID变了,那么反序列化的时候就不会变成原始的类了,还会抛异常,主要就是用于版本控制。