Java 정렬화(Serialization) 메커니즘
4442 단어 java서열화serialization
대상 상태를 바이트 흐름으로 변환한 후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;
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.