프로그래밍을 좋아하는 당신처럼!
SpringBoot 실습 과정 배우기 https://edu.csdn.net/course/detail/31433
SpringCloud 입문 과정 배우기 https://edu.csdn.net/course/detail/31451
머리말
냉장고 문을 열고 코끼리를 넣고 냉장고 문을 닫습니다.
객체 저장은 직렬화만큼 간단합니다.
직렬화 및 역 직렬화 란?
- 직렬화는 객체를 일련의 바이트로 변환하는 프로세스입니다.
- 역 직렬화는 바이트 시퀀스를 개체로 복원하는 프로세스입니다.
직렬화로 수행 할 수있는 작업
Java에서 직렬화의 역할은 매우 중요합니다.
- 개체 지속성, 개체 상태를 디스크에 저장하고 예기치 않은 중지 후 다음에 JVM을 다시 시작하면 디스크에서 개체를 완전히 읽을 수도 있습니다.
- 네트워크 전송, 객체는 바이트 시퀀스로 변환되어 네트워크로 전송됩니다.
- 프로세스 간 통신, 두 개의 다른 프로세스가 개체를 전달할 수 있음
직렬화 구현
java.io의 객체 스트림은 객체를 직렬화 및 역 직렬화하는 메소드를 제공합니다.
객체 출력 스트림 ObjectOutputStream
생성 방법 :
ObjectOutputStream(OutputStream out)
개체 저장 방법 :
void writeObject(Object obj)
객체 입력 스트림 ObjectInputStream
생성 방법 :
ObjectInputStream(InputStream out)
개체 방법 읽기 :
Object readObject()
직렬화에 대한주의 사항
- Serializable 인터페이스를 구현하는 객체 만 직렬화 할 수 있습니다. 그렇지 않으면 NotSerializableException이 발생합니다.
- 부모 클래스가 Serializable 인터페이스를 구현하는 경우 하위 클래스는 인터페이스를 구현하지 않을 수 있습니다.
- 클래스는 직렬화되어야하며 클래스의 모든 속성은 직렬화되어야합니다.
- 정적 및 임시 유형으로 선언 된 속성은 직렬화 할 수 없습니다.
직렬화 사례
이 사례는 코끼리와 여러 코끼리를 각각 디스크 파일에 저장하는 방법을 보여줍니다.
/**
* 大象
*
*/
public class Elephant implements Serializable{
/**
*
*/
private static final long serialVersionUID = 2483988729860853698L;
private String name;
private Integer age;
private Double weight;
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 double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public Elephant(String name, int age, double weight) {
super();
this.name = name;
this.age = age;
this.weight = weight;
}
public Elephant() {
super();
}
@Override
public String toString() {
return "Elephont [name=" + name + ", age=" + age + ", weight=" + weight + "]";
}
public void run(){
System.out.println(name+"在跑!!!!");
}
}
@Test
public void testObjectOutput(){
//创建对象输出流
try(ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("C:/xpp/object"))){
//存入Java对象
out.writeObject(new Elephant("非洲大象",20,5000));
//存入对象集合
List<Elephant> list = Arrays.asList(
new Elephant("非洲大黑象",10,10000),
new Elephant("非洲小黑象",10,10000),
new Elephant("亚洲小黑象",10,10000),
new Elephant("亚洲大黑象",10,10000),
new Elephant("亚洲小白象",10,10000));
out.writeObject(list);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void testObjectInput(){
//创建对象输入流
try(ObjectInputStream in = new ObjectInputStream(
new FileInputStream("C:/xpp/object"))){
//读取Java对象
Elephant elephont = (Elephant) in.readObject();
elephont.run();
//读取对象集合
List<Elephant> list = (List<Elephant>) in.readObject();
for(Elephant ele : list){
ele.run();
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
모든 Java 컬렉션도 Serializable 인터페이스를 구현하기 때문에 Java 객체인지 Java 컬렉션인지 파일로 직렬화 할 수 있습니다.
serialVersionUID의 역할
클래스가 직렬화 인터페이스를 구현할 때 IDE는 컴파일 경고를 표시하고 serialVersionUID를 생성하라는 메시지를 표시합니다.
즉, 클래스의 상수 :
private static final long serialVersionUID = 2483988729860853698L;
이 상수의 목적은 무엇입니까?
- serialVersionUID는 직렬화 클래스의 버전 번호입니다.
- 수동으로 추가하지 않으면 시스템에서 자동으로 버전 번호를 추가합니다. 객체를 직렬화 한 후 클래스의 코드를 임의로 수정하면 클래스 버전 번호가 변경됩니다. 역 직렬화 할 때 객체에 유형 비 호환성 문제 InvalidClassException이 있습니다. .
- 상수를 수동으로 추가하면 클래스가 수정 된 후에도 버전 번호가 변경되지 않으며 역 직렬화로 인해 유형 비 호환성이 발생하지 않습니다.
요약하자면
- 직렬화는 객체를 바이트 시퀀스로 변환하고 파일이나 네트워크에 저장하는 데 사용되는 Java의 일반적인 기술입니다.
- Java의 ObjectOutputStream 및 ObjectInputStream은 직렬화 및 역 직렬화를위한 메소드를 제공합니다.
- 직렬화 할 객체는 직렬화 가능 인터페이스를 구현해야합니다.
다른 Java 지식을 배워야하는 경우 여기 에서 Java 요약에 대한 매우 상세한 지식을 찌르십시오.