1.序列化的基本概念:
将内存中保存的基本对象变为二进制数据流的形式进行传输,或将其保存在文本中。
但不以为着所有类的对象都可以被序列化,需要被序列化的类对象往往需要传输使用,同时这个类必须实现java.io.Serializeable接口。但是这个接口没有任何的方法定义,只是一个标识而已。
序列化/反序列化:
1.一个类的实例化对象要能够进行序列化,必须实现Serializable(序列化接口)
2.序列化: 对象变成二进制流 ObjectOutputStream
3.反序列化:二进制流变成对象 ObjectInputStream
4.transient关键字 修饰的属性不参与序列化
Serializable:Java语言提供,效率比较低,仅限于Java语言
Json:Object ->Json 多语言
Thrift: Object->byte[] 多语言
ProtocolBuffer: Object -> byte[] 对语言 效率比较高
public class TestSerializable implements Serializable {
public static void main(String[] args) {
Person person1 = new Person();
person1.setName("张三");
person1.setAge(22);
System.out.println("person1" + person1);
//序列化技术: Java Object -> byte[]
//写在文件里,写在byte[]
try (
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(stream);) {
out.writeObject(person1);//可以写一个对象出来,通用的引用类型
out.flush();//刷新
//data对象变成的二进制流
byte[] data = stream.toByteArray();
// System.out.println(new String(data)); //打印二进制流
//将二进制流转成对象
try (ByteArrayInputStream inStream = new ByteArrayInputStream(data);
ObjectInputStream in = new ObjectInputStream(inStream)) {
//byte[] -> Object
Object returnValue = in.readObject();//读一个对象
System.out.println(returnValue.getClass());
Person person2 = (Person) returnValue;
System.out.println("person2" + person2);
System.out.println(person1 == person1); //false
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
static class Person {
private String name;
private Integer 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 +
'}';
}
}
}