[코드 기록 라 이 프] Serializable (직렬 화)

직렬 화:
  대상 을 바이트 시퀀스 로 변환 (냉동)
  바이트 시퀀스 를 대상 으로 변환 (해동)
직렬 화 응용:
  메모리 의 대상 을 파일 이나 데이터베이스 에 저장 합 니 다.
  네트워크 에서 대상 을 전송 하 다.
직렬 화 된 클래스 가 필요 합 니 다. Serializable 인 터 페 이 스 를 실현 해 야 합 니 다.

  public class Person implements Serializable{
        ........
  }

파일 에 클래스 를 기록 합 니 다 (클래스 의 직렬 화):

  public static void main(String[] args) throws Exception{
        Student stu = new Student();
        File file = new File("bb.txt");
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
        oos.writeObject(stu);
}

파일 에 저 장 된 데 이 터 를 대상 으로 변환 합 니 다 (역 직렬 화).

  public static void main(String[] args) throws Exception{
        File file = new File("bb.txt");
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
        Object obj = ois.readObject();
        System.out.println(obj.hashCode());
}

반 서열 화 할 때, 클래스 의 구조 방법 을 호출 하 였 습 니까?
  구조 방법 은 호출 되 지 않 습 니 다.
  구조 방법의 역할 은 클래스 의 상 태 를 초기 화 하 는 것 이 고 반 직렬 화 할 때 클래스 의 상 태 는 직렬 화 파일 에 저 장 됩 니 다.
  그 러 니 더 이상 클래스 의 상 태 를 초기 화 할 필요 가 없습니다.
직렬 화 전의 대상 과 직렬 화 후의 대상 은 같은 대상 입 니까?
  같은 대상 이 아 닙 니 다. 직렬 화 된 대상 은 상태 만 같 습 니 다 (각 속성 값 이 같 습 니 다)
만약 에 특정한 시기 에 민감 한 정 보 를 직렬 화 할 필요 가 없 을 수도 있 습 니 다. 예 를 들 어 (계 정), 예 를 들 어 (비밀번호).
  Transient (과도) 키워드: 지정 한 필드 에서 직렬 화 기능 을 닫 습 니 다.

  public class Person implements Serializable{
	private String name;
	private int age;
         //   Person ,salary          
	private transient double salary;   
           ........
  }

네트워크 통신 전송 대상 (클 라 이언 트):

  public class Client {
   public static void main(String[] args) throws Exception {
	//        
	Clothing clothing = new Clothing("  ", "  ");
	User user = new User(1, "yelong1", " ", new Date());
	user.setClothing(clothing);
	
	//    
	Socket socket = new Socket("127.0.0.1", 8888);
	System.out.println("    .........");
         ObjectOutputStream oos = 
         new ObjectOutputStream(socket.getOutputStream());

         //         8888      
	oos.writeObject(user);
	System.out.println("    .........");
	oos.close();
    }
}

서버:

  public class Server {
	public static void main(String[] args) throws Exception {
		//       
	ServerSocket ss = new ServerSocket(8888);
	System.out.println("     ,       .....");
	Socket socket = ss.accept();		
		//    
	ObjectInputStream ois = 
        new ObjectInputStream(socket.getInputStream());
	User user = (User) ois.readObject();
		
		//      
	System.out.println("    .........");
	System.out.println("id:" + user.getId());
	System.out.println("name:" + user.getName());
	System.out.println("sex:" + user.getSex());
	System.out.println("brithday:" + user.getBirthday());
	System.out.println("memo:" + user.getMemo());
	Clothing serialClothing = user.getClothing();
	System.out.println("clothing:" + serialClothing.getColor() + “ " + serialClothing.getName());
	ois.close();
	}
}

ObjectOutputStream 은 자바 대상 의 기본 데이터 형식 과 도형 을 OutputStream 에 기록 합 니 다.
ObjectInputStream 으로 대상 을 읽 기 (재 구성) 할 수 있 습 니 다.
스 트림 에서 파일 을 사용 하면 대상 의 영구적 인 저장 을 실현 할 수 있 습 니 다.
스 트림 이 네트워크 소켓 스 트림 이 라면 다른 호스트 나 다른 프로 세 스 에서 대상 을 재 구성 할 수 있 습 니 다.
java. io. Serializable 인 터 페 이 스 를 지원 하 는 대상 만 스 트림 에 기록 할 수 있 습 니 다.
모든 serializable 대상 의 클래스 가 인 코딩 되 고 인 코딩 내용 은 클래스 이름과 클래스 서명 을 포함 합 니 다.
대상 의 필드 값 과 배열 값, 그리고 초기 대상 에서 인 용 된 다른 모든 대상 의 패 키 지 를 닫 습 니 다.
writeObject 방법 은 대상 을 흐름 에 기록 하 는 데 사 용 됩 니 다.
모든 대상 (String 과 배열 포함) 은 writeObject 를 통 해 기록 할 수 있 습 니 다.
여러 대상 이나 기원 을 흐름 에 쓸 수 있 습 니 다.
대상 을 기록 할 때 와 같은 형식 과 순 서 를 사용 하여 해당 Object Inputstream 에서 대상 을 읽 어야 합 니 다.
DataOutput 의 적절 한 방법 으로 기본 데이터 형식 을 흐름 에 기록 할 수도 있다.
문자열 을 writeUTF 방법 으로 쓸 수도 있 습 니 다.
대상 의 기본 직렬 화 메커니즘 에 기 록 된 내용 은 대상 의 클래스, 클래스 서명, 그리고 비 과도 와 비 정적 필드 의 값 입 니 다.
다른 대상 의 인용 (과도 와 정적 필드 제외) 도 그 대상 을 기록 할 수 있 습 니 다.
인용 공유 체 제 를 사용 하여 하나의 대상 의 여러 인용 을 인 코딩 할 수 있 습 니 다. 그러면 대상 의 도형 을 최초 로 기록 할 때의 모양 으로 복원 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기