Java에서는 모든 것이 객체이며 분산 환경에서는 종종 네트워크 나 장치의 한쪽 끝에서 다른 쪽 끝으로 물체를 전달해야합니다. 이를 위해서는 양쪽 끝에서 데이터를 전송할 수있는 프로토콜이 필요합니다. Java 직렬화 메커니즘은이 문제를 해결하기 위해 만들어졌습니다.
객체 상태를 바이트 스트림으로 변환 한 후 java.io 패키지의 다양한 바이트 스트림 클래스를 사용하여 파일에 저장하거나 다른 스레드로 파이프하거나 객체 데이터를 네트워크 연결을 통해 다른 호스트로 보낼 수 있습니다. 객체 직렬화 기능은 매우 간단하고 강력하며 RMI, 소켓, JMS 및 EJB에서 사용됩니다. 객체 직렬화 문제는 네트워크 프로그래밍에서 가장 핵심적인 문제는 아니지만 매우 중요하며 실질적인 의미가 있습니다.
Java Object Serialization은 하나의 객체의 데이터를 유지할뿐만 아니라 객체에서 참조 된 각 객체의 데이터를 재귀 적으로 저장합니다. 전체 오브젝트 계층 구조는 바이트 스트림으로 기록하거나 파일에 저장하거나 네트워크 연결에 전달 될 수 있습니다. 객체 직렬화는 객체의 "깊은 복사", 즉 객체 자체와 참조 된 객체 자체를 복사하는 데 사용될 수 있습니다. 객체를 직렬화하면 전체 객체의 시퀀스가 발생할 수 있습니다.
기본 사용법 :
직렬화는 클래스 또는 기본 데이터 유형을 파일, 바이트 스트림 및 네트워크 데이터 스트림을 포함한 데이터 스트림으로 유지하는 것을 말합니다.
Java의 직렬화 구현은 주로 Objectoututstream과 Objectinputstream의 두 가지 클래스에 의존합니다. 이들은 Java IO 시스템에서 출력 스트림 및 입력 스트림의 서브 클래스입니다. Java Io의 스트림이므로 스트림처럼 작동 할 수 있습니다. 사용 방법은 다음과 같습니다.
import java.io.bytearrayinputstream; import java.io.BytearRayoutputStream; import java.io.ioexception; import java.io.objectinputstream; import java.io.objectoutputStream; java.io.serializable import; 공개 클래스 쌍은 직렬화 가능한 {개인 정적 최종 긴 SerialversionUID = -1874850715617681161L을 구현합니다. 개인 int 유형; 개인 문자열 이름; public int gettype () {return type; } public void settype (int type) {this.type = type; } public String getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } public 쌍 (int type, string name) {super (); this.type = 유형; this.name = 이름; } public static void main (String [] args)은 ioException, classNotFoundException {// todo 자동 생성 메소드 스터브 // 객체 쌍 ByTearRayoutputStream BOS = New ByTearRayoutputStream (); ObjectOutputStream OOS = 새로운 ObjectOutputStream (BOS); 쌍 쌍 = 새로운 쌍 (1, "찰리"); oos.writeobject (쌍); // 객체를 제외하고, 새로운 개체를 얻으십시오. NewPair bytearrayinputStream bis = 새로운 BytearRayinputStream (bos.tobytearray ()); ObjectInputStream OIS = New ObjectInputStream (BIS); newPair = (pair) ois.readobject (); System.out.println (newPair.getType ()+":"+newPair.getName ()); }}1. 두 클래스는 데코레이터 패턴에 있습니다. 그것들을 만들 때, 그들은 바이트 기반 스트림을 통과해야합니다. 이 스트림은 실제로 직렬화 된 데이터를 저장하는 스트림입니다.
2. 지속 된 클래스는 직렬화 가능한 인터페이스를 구현해야합니다. 이 인터페이스에는 기능이 없지만 마킹 인터페이스 일뿐입니다. 한 머신에서 직렬화가 수행되고 결과 데이터가 사막화를 위해 다른 기계로 전송되는 경우이 두 컴퓨터의 클래스는 정확히 동일해야합니다. 그렇지 않으면 직렬화가 성공하지 못합니다.
3. 위의 코드에서 문자열을 가져 오려면 Tostring을 사용하지 말고이 문자열에서 BytearRayinputStream을 얻은 다음 필자화하십시오. BOS는 바이트로 저장됩니다. 문자에 저장된 문자열로 변환하면 필연적으로 데이터 변경이 발생하며 문자열에서 그려진 바이트는 이전 바이트 []가 아닙니다. 직렬화 된 데이터를 XML 파일에 저장하기 때문에이 문제가 발생했습니다. 이 문제에 대한 특정 해결책의 다른 기사를 참조하십시오.
www.vevb.com/article/88130.htm
Java Virtual Machine은 직렬화 및 사제화 할 때 무엇을합니까?
이 두 클래스의 설명에서 Java 직렬화 메커니즘은 Javadoc에서 자세히 설명되어 있습니다.
인용하다
객체에 대한 기본 직렬화 메커니즘은 객체의 클래스, 클래스 서명 및 모든 비 유도 및 비 정적 필드의 값을 씁니다. 다른 객체에 대한 참조 (일시적 또는 정적 필드 제외)는 해당 객체도 작성됩니다. 단일 객체에 대한 다중 참조는 참조 공유 메커니즘을 사용하여 인코딩되어 객체의 그래프를 원본을 작성할 때와 동일한 모양으로 복원 할 수 있습니다.
기본 직렬화 메커니즘은 스트림에 데이터를 작성합니다.
1. 객체가 속한 클래스
2. 클래스 서명
3. 모든 비은성 및 비 정적 특성
4. 다른 객체에 대한 참조는 또한 이러한 객체의 직렬화를 유발합니다.
5. 여러 참조가 객체를 가리키면 공유 기준 메커니즘이 사용됩니다.
인용하다
직렬화 및 사막화 프로세스 중에 특별 처리가 필요한 클래스는 이러한 정확한 서명과 함께 특별한 방법을 구현해야합니다.
private void readObject (java.io.objectinputStream 스트림)는 ioException, classNotFoundException; private void writeObject (java.io.objectOutputStream 스트림)는 ioException private void readObjectNodata ()를 객체 streamException;