[코드 기록 라 이 프] Serializable (직렬 화)
4670 단어 자바codesocketSerializable
대상 을 바이트 시퀀스 로 변환 (냉동)
바이트 시퀀스 를 대상 으로 변환 (해동)
직렬 화 응용:
메모리 의 대상 을 파일 이나 데이터베이스 에 저장 합 니 다.
네트워크 에서 대상 을 전송 하 다.
직렬 화 된 클래스 가 필요 합 니 다. 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 방법 으로 쓸 수도 있 습 니 다.
대상 의 기본 직렬 화 메커니즘 에 기 록 된 내용 은 대상 의 클래스, 클래스 서명, 그리고 비 과도 와 비 정적 필드 의 값 입 니 다.
다른 대상 의 인용 (과도 와 정적 필드 제외) 도 그 대상 을 기록 할 수 있 습 니 다.
인용 공유 체 제 를 사용 하여 하나의 대상 의 여러 인용 을 인 코딩 할 수 있 습 니 다. 그러면 대상 의 도형 을 최초 로 기록 할 때의 모양 으로 복원 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.