Java 기초 21 직렬화 및 역 직렬화

프로그래밍을 좋아하는 당신처럼!
SpringBoot 실습 과정 배우기 https://edu.csdn.net/course/detail/31433
SpringCloud 입문 과정 배우기 https://edu.csdn.net/course/detail/31451


머리말

코끼리를 냉장고에 넣으려면 몇 단계가 필요합니까?

냉장고 문을 열고 코끼리를 넣고 냉장고 문을 닫습니다.
객체 저장은 직렬화만큼 간단합니다.

직렬화 및 역 직렬화 란?

  • 직렬화는 객체를 일련의 바이트로 변환하는 프로세스입니다.
  • 역 직렬화는 바이트 시퀀스를 개체로 복원하는 프로세스입니다.

직렬화로 수행 할 수있는 작업

Java에서 직렬화의 역할은 매우 중요합니다.

  1. 개체 지속성, 개체 상태를 디스크에 저장하고 예기치 않은 중지 후 다음에 JVM을 다시 시작하면 디스크에서 개체를 완전히 읽을 수도 있습니다.
  2. 네트워크 전송, 객체는 바이트 시퀀스로 변환되어 네트워크로 전송됩니다.
  3. 프로세스 간 통신, 두 개의 다른 프로세스가 개체를 전달할 수 있음

직렬화 구현

java.io의 객체 스트림은 객체를 직렬화 및 역 직렬화하는 메소드를 제공합니다.

객체 출력 스트림 ObjectOutputStream
생성 방법 :

ObjectOutputStream(OutputStream out)

개체 저장 방법 :

void writeObject(Object obj)

객체 입력 스트림 ObjectInputStream
생성 방법 :

ObjectInputStream(InputStream out)

개체 방법 읽기 :

Object readObject()

직렬화에 대한주의 사항

  1. Serializable 인터페이스를 구현하는 객체 만 직렬화 할 수 있습니다. 그렇지 않으면 NotSerializableException이 발생합니다.
  2. 부모 클래스가 Serializable 인터페이스를 구현하는 경우 하위 클래스는 인터페이스를 구현하지 않을 수 있습니다.
  3. 클래스는 직렬화되어야하며 클래스의 모든 속성은 직렬화되어야합니다.
  4. 정적 및 임시 유형으로 선언 된 속성은 직렬화 할 수 없습니다.

직렬화 사례

이 사례는 코끼리와 여러 코끼리를 각각 디스크 파일에 저장하는 방법을 보여줍니다.

/**
 * 大象
 *
 */
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 요약에 대한 매우 상세한 지식을 찌르십시오.

추천

출처blog.csdn.net/u013343114/article/details/112786964