SerialVersionUID, ObjectInputStream과 ObjectOutputStream 클래스, Serializable 인터페이스, SerialVersionUID의 역할과 사용 방법

3289 단어
ObjectInputStream과 ObjectOutputStream 클래스에서 읽거나 쓰는 대상은serializable 인터페이스를 실현해야 합니다. 대상의transient와static 형식 구성원 변수는 읽거나 쓰지 않습니다.
Serializable은 사실 빈 인터페이스입니다.
package java.io;

public interface Serializable {
}
Serializable는 빈 인터페이스로 구체적인 내용이 없고 클래스를 간단하게 표시하는 대상이 서열화될 수 있도록 하는 목적이 있습니다.어떤 상황에서 서열화가 필요합니까
a) 메모리의 대상을 하드디스크에 기록하고 싶을 때;
b) 당신이 소켓로 인터넷에서 대상을 전송하고 싶을 때;
c) RMI를 통해 개체를 전송하고 싶을 때다시 한 번 설명하자면 a) 예를 들어 당신의 메모리가 부족하면 컴퓨터는 메모리 안의 일부 대상을 하드디스크에 잠시 저장하고 사용할 때 메모리에 읽어야 한다. 하드디스크의 그 부분 저장 공간은 이른바 가상 메모리이다.예를 들어 특정한 대상을 파일에 저장하려면 며칠 간격으로 그것을 꺼내서 사용해야 한다. 그러면 이때 실현해야 한다Serializable 인터페이스.
public static void main(String args[]) throws Exception {

		class Student implements Serializable {

			private static final long serialVersionUID = 0xbc9903f7986df52fL;

			String name;
			int id ;
			int age;
			String department;
			public Student(String name, int id, int age, String department) {
				this.age = age;
				this.department = department;
				this.id = id;
				this.name = name;
			}
		}

		Student s1=new Student(" 2 ", 1, 5, " ");
		Student s2=new Student(" 1", 2, 9, " ");

		FileOutputStream fout = new FileOutputStream("C:\\student.txt");
		ObjectOutputStream out=new ObjectOutputStream(fout);
		out.writeObject(s1);
		out.writeObject(s2);
		out.close();
		FileInputStream fin=new FileInputStream("C:\\student.txt");
		ObjectInputStream in=new ObjectInputStream(fin);
		try {
			s1=(Student) in.readObject();
			s2=(Student) in.readObject();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		in.close();
		System.out.print("name:"+s1.name);
		System.out.print(" id:"+s1.id);
		System.out.print(" age:"+s1.age);
		System.out.println(" department:"+s1.department);
		System.out.print("name:"+s2.name);
		System.out.print(" id:"+s2.id);
		System.out.print(" age:"+s2.age);
		System.out.println(" department:"+s2.department);
	}
상단 은 서열화 반서열화 의 예 이다
그리고 우리는 다음과 같은 몇 가지 문제를 고려한다
문제1: A단과 B단이 있다고 가정하면 2곳의 SerialVersionUID가 일치하지 않으면 어떤 오류가 발생합니까?
문제2: 두 곳의 SerialVersionUID가 일치한다고 가정하면 A단에 한 필드가 추가되고 B단이 변하지 않는다면 어떤 상황일까요?
문제3: 두 곳의 SerialVersionUID가 일치한다고 가정하면 B단에 한 필드가 추가되고 A단이 변하지 않는다면 어떤 상황일까요?
문제4: 두 곳의 SerialVersionUID가 일치한다고 가정하면 A단이 한 필드를 줄이고 B단이 변하지 않는다면 어떤 상황일까요?
문제5: 두 곳의 SerialVersionUID가 일치한다고 가정하면 B단이 한 필드를 줄이고 A단이 변하지 않는다면 어떤 상황일까요?
문제 발생: serialVersionUID의 역할 및 사용 방법

좋은 웹페이지 즐겨찾기