Java 정렬화(Serialization) 메커니즘

Java에서 모든 것이 대상이고 분포식 환경에서 항상 Object를 이 쪽 네트워크나 장치에서 다른 쪽으로 전달해야 한다.양쪽에서 데이터를 전송할 수 있는 프로토콜이 필요합니다.Java 서열화 메커니즘은 바로 이 문제를 해결하기 위해 만들어진 것이다.
대상 상태를 바이트 흐름으로 변환한 후java를 사용할 수 있습니다.io 패키지의 각종 바이트 흐름 클래스는 파일에 저장하고, 파이프는 다른 라인에 저장하거나, 네트워크 연결을 통해 대상 데이터를 다른 호스트로 보냅니다.RMI, Socket, JMS, EJB 모두에서 사용할 수 있는 객체 정렬화 기능은 매우 간단하고 강력합니다.대상 서열화 문제는 인터넷 프로그래밍에서 가장 핵심적인 과제는 아니지만 상당히 중요하고 많은 실용적 의미를 가진다.
java 대상 서열화는 하나의 대상의 데이터를 보존할 뿐만 아니라, 대상이 인용하는 모든 대상의 데이터를 귀속적으로 저장합니다.전체 대상을 바이트 흐름에 기록할 수 있고, 파일에 저장하거나 네트워크 연결에 전달할 수 있다.객체 정렬화를 사용하여 객체의 딥 복제, 즉 객체 자체와 참조된 객체 자체를 복제할 수 있습니다.하나의 대상을 서열화하면 전체 대상의 서열을 얻을 수 있다.
기본 사용 방법:
Serialization은 파일, 바이트 흐름, 네트워크 데이터 흐름을 포함하여 클래스나 기본적인 데이터 형식을 데이터 흐름 (Stream) 에 영구화하는 것을 말한다.
JAVA에서 serialization을 실현하는 데는 주로 두 가지 종류가 있는데 그것이 바로 Object Ouput Stream과 Object Input Stream이다.그들은 JAVA IO 시스템의 Output Stream과 Input Stream의 하위 클래스입니다.그들이 JAVA IO의 흐름이라면 조작과 같은 흐름으로 조작할 수 있다.다음은 그들이 사용하는 방법입니다.

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 
 
public class Pair implements Serializable{ 
 
 private static final long serialVersionUID = -1874850715617681161L; 
 private int type; 
 private String name; 
 
 public int getType() { 
 return type; 
 } 
 
 public void setType(int type) { 
 this.type = type; 
 } 
 
 public String getName() { 
 return name; 
 } 
 
 public void setName(String name) { 
 this.name = name; 
 } 
 
 
 public Pair(int type, String name) { 
 super(); 
 this.type = type; 
 this.name = name; 
 } 
 
 public static void main(String[] args) throws IOException, ClassNotFoundException { 
 // TODO Auto-generated method stub 
 //serialize object pair 
 ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
 ObjectOutputStream oos = new ObjectOutputStream(bos); 
 Pair pair = new Pair(1, "charlie"); 
 oos.writeObject(pair); 
 //deserialize object, get new object newpair 
 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); 
 ObjectInputStream ois = new ObjectInputStream(bis); 
 Pair newpair = (Pair) ois.readObject(); 
 
 System.out.println(newpair.getType()+":"+newpair.getName()); 
 } 
} 
1. 이 두 종류는 모두decorator 모드입니다. 그들을 만들 때 바이트 기반의 흐름을 전송해야 합니다. 진정으로 아래에 서열화된 데이터를 저장하는 것은 모두 이 흐름입니다.
 2. 지속화된 클래스는 Serializable 인터페이스를 실현하려고 합니다. 이 인터페이스는 함수가 없고 표시 인터페이스일 뿐입니다.만약 한 기계에서 서열화를 하고 얻은 데이터를 다른 기계로 전송하여 반서열화를 한다면 이 두 기계의 종류는 완전히 같아야 한다. 그렇지 않으면 서열화는 성공하지 못할 것이다.
 3. 위 코드의 bos를 toString으로 String을 얻은 다음 이 String에서 ByteArray InputStream을 얻어 반서열화하지 마십시오.bos는 바이트로 저장됩니다. 문자로 저장된 String으로 전환하면 데이터의 변화가 생길 것입니다. String에서 온byte[]도 이전의byte[]가 아닙니다.내가 이 문제를 겪은 것은 서열화된 데이터를 xml 파일에 저장하고 싶었기 때문이다.이 문제의 구체적인 해결 방법은 나의 또 다른 문장을 볼 수 있다.
www.jb51.net/article/88130.htm
자바 가상 머신은 서열화와 반서열화 때 무엇을 했습니까?
javadoc에서 이 두 종류에 대한 설명에서 java의 서열화 메커니즘에 대해 상세하게 설명했습니다.
인용하다
The default serialization mechanism for an object writes the class of the object, the class signature, and the values of all non-transient and non-static fields. References to other objects (except in transient or static fields) cause those objects to be written also. Multiple references to a single object are encoded using a reference sharing mechanism so that graphs of objects can be restored to the same shape as when the original was written.
기본 정렬화 메커니즘이 흐름에 쓴 데이터는 다음과 같습니다.
1. 객체가 속한 클래스
2, 클래스 서명
3. 모든 비transient와 비static의 속성
4. 다른 대상에 대한 인용도 이러한 대상에 대한 서열화를 초래할 수 있다
5. 여러 인용이 하나의 대상을 가리키면sharingreference 메커니즘을 사용합니다
인용하다
Classes that require special handling during the serialization and deserialization process must implement special methods with these exact signatures:

private void readObject(java.io.ObjectInputStream stream) 
 throws IOException, ClassNotFoundException; 
private void writeObject(java.io.ObjectOutputStream stream) 
 throws IOException 
private void readObjectNoData() 
 throws ObjectStreamException; 

좋은 웹페이지 즐겨찾기