java 강좌의 대상 서열화 사용 기초 예시 상세 설명
Java 객체 정렬화 메커니즘은 일반적으로 다음과 같은 두 가지 용도로 사용됩니다.
Java의 Java Beans: Bean의 상태 정보는 일반적으로 설계할 때 설정된 것입니다. Bean의 상태 정보는 저장되어 있어야 합니다. 프로그램이 실행될 때 이 상태 정보를 회복할 수 있습니다. 이것은 대상의 상태를 파일에 저장한 후에 대상의 상태를 읽어서 대상을 재구성하고 프로그램의 상태를 회복할 수 있습니다.RMI는 이 컴퓨터에서처럼 원격 컴퓨터의 대상을 조작할 수 있습니다.또는 플러그인을 사용하여 네트워크에서 대상을 전송하는 프로그램으로 말하자면, 이것들은 모두serializaiton 메커니즘을 실현해야 한다.우리는 클래스를 통해 자바를 실현한다.io.Serializable 인터페이스는 클래스를 서열화할 수 있습니다.이 인터페이스는 제조자 (marker) 인터페이스다.즉, 그것을 실현하는 유형에 대해 말하자면, 이 인터페이스는 어떠한 방법도 실현할 필요가 없다.JVM(Java Virtual Machine)을 알리는 데 주로 사용되며 객체를 정렬해야 합니다.
이것에 대해 몇 가지 우리는 명확하게 해야 한다.
모든 클래스가 서열화될 수 있는 것은 아닙니다. cmd에서 serialver Java를 입력하십시오.net.Socket, socket의 서열화 가능 여부를 얻을 수 있습니다. 실제로 socket은 서열화할 수 없습니다.자바는 많은 기초류가 이미 serializable 인터페이스를 실현했다. 예를 들어string,vector 등이다.그러나 예를 들어hashtable는serializable 인터페이스를 실현하지 못했다.객체를 읽거나 스트림에 쓰는 주요 클래스는 ObjectOutputStream과 ObjectInputStream입니다.ObjectOutputStream은 출력 흐름에 대상을 쓰는 writeObject 방법을 제공하고, ObjectInputStream은 입력 흐름에서 대상을 읽는 readObject 방법을 제공합니다.이 방법을 사용하는 대상은 반드시 이미 서열화되어야 한다.즉, Serializable 인터페이스를 구현해야 합니다.만약 당신이hashtable 대상을 쓰고 싶다면, 이상을 얻을 수 있습니다.서열화 과정은 대상이 바이트 흐름을 쓰고 바이트 흐름에서 대상을 읽는 것이다.객체 상태를 바이트 흐름으로 변환하면 Java를 사용할 수 있습니다.io 패키지의 각종 바이트 흐름 클래스는 파일에 저장하고, 파이프는 다른 라인에 저장하거나, 네트워크 연결을 통해 대상 데이터를 다른 호스트로 보냅니다.RMI, Socket, JMS, EJB 모두에서 사용할 수 있는 객체 정렬화 기능은 매우 간단하고 강력합니다.대상 서열화 문제는 인터넷 프로그래밍에서 가장 감동적인 과제는 아니지만 상당히 중요하고 많은 실용적 의미를 가진다.대상 서열화는 분포식 대상을 실현할 수 있다.주요 응용 프로그램: RMI는 로컬 시스템에서 객체를 실행할 때와 같이 원격 호스트의 서비스를 정렬하여 실행해야 합니다.Java 객체 정렬화는 한 객체의 데이터를 보존할 뿐만 아니라 객체가 참조하는 각 객체의 데이터를 순차적으로 저장합니다.전체 대상을 바이트 흐름에 기록할 수 있고, 파일에 저장하거나 네트워크 연결에 전달할 수 있다.객체 정렬화를 사용하여 객체의 딥 복제, 즉 객체 자체와 참조된 객체 자체를 복제할 수 있습니다.하나의 대상을 서열화하면 전체 대상의 서열을 얻을 수 있다.Java 서열화는 비교적 간단하며, 일반적으로 객체 상태를 저장하고 복구하는 맞춤형 코드를 작성할 필요가 없다.Java 구현.io.Serializable 인터페이스의 클래스 대상은 바이트 흐름으로 전환하거나 바이트 흐름에서 복구할 수 있으며, 클래스에 코드를 추가할 필요가 없습니다.사용자 정의 코드가 개체 상태를 저장하거나 복구해야 하는 경우는 극소수입니다.여기서 주의해야 할 것은 모든 클래스가 서열화할 수 있는 것이 아니라 어떤 클래스는 서열화할 수 없는 것이다. 예를 들어 라인과 관련된 클래스는 특정한 JVM과 매우 복잡한 관계를 가진다.서열화 메커니즘:
서열화는 두 부분으로 나뉘는데 그것이 바로 서열화와 반서열화이다.서열화는 이 과정의 첫 번째 부분으로 데이터를 바이트 흐름으로 분해하여 파일에 저장하거나 네트워크에 전송하도록 한다.반서열화는 바이트 흐름을 열고 대상을 재구성하는 것이다.대상 서열화는 기본 데이터 형식을 바이트 표시로 변환해야 할 뿐만 아니라 때로는 데이터를 복구해야 한다.데이터를 복구하려면 데이터를 복구하는 대상의 실례가 필요합니다.ObjectOutputStream의 서열화 과정은 바이트 흐름과 연결되며 대상 유형과 버전 정보를 포함합니다.정렬을 거꾸로 하면 JVM은 헤더 정보로 객체 인스턴스를 생성한 다음 객체 바이트 흐름의 데이터를 객체 데이터 구성원에 복사합니다.다음은 두 부분으로 나누어 설명합니다.
객체 흐름 처리: (서열화 프로세스 및 반서열화 프로세스) Java.io 패키지는 두 개의 서열화된 대상의 클래스가 있습니다.ObjectOutputStream은 바이트 흐름에 대상을 쓰고 ObjectInputStream은 바이트 흐름에서 대상을 재구성합니다.Object Output Stream 클래스부터 알아봅시다.ObjectOutputStream 클래스는 DataOutput 인터페이스를 확장합니다.writeObject() 메서드는 객체 서열화에 가장 중요한 메서드입니다.객체에 다른 객체에 대한 참조가 포함되어 있는 경우 writeObject() 메서드는 객체를 순차적으로 정렬합니다.각 ObjectOutputStream은 동일한 객체의 여러 복제본을 전송하지 못하도록 정렬된 객체 참조 테이블을 유지합니다.(이점은 매우 중요합니다) writeObject()는 전체 교차 인용 대상을 서열화할 수 있기 때문에 같은 ObjectOutputStream 실례가 실수로 같은 대상을 서열화할 수 있습니다.이 때, 대상 바이트 흐름을 다시 쓰는 것이 아니라 반인용 서열화를 진행합니다.
다음은 Object Output Stream 클래스를 예로 들어보겠습니다
// today's date .
FileOutputStream f = new FileOutputStream ("tmp" );
ObjectOutputStream s = new ObjectOutputStream (f);
s.writeObject("Today" );
s.writeObject(new Date ());
s.flush();
이제 Object Input Stream 클래스를 알아보겠습니다.ObjectOutputStream과 비슷합니다.DataInput 인터페이스를 확장합니다.Object InputStream의 방법은 Data InputStream에서 Java의 기본 데이터 형식을 읽는 공개 방법을 미러링합니다.readObject() 메서드는 바이트 흐름에서 객체를 순서대로 정렬합니다.readObject() 메서드를 호출할 때마다 흐름의 다음 Object를 되돌려줍니다.대상 바이트 흐름은 클래스의 바이트 코드를 전송하는 것이 아니라 클래스 이름과 서명을 포함합니다.readObject()가 객체를 받으면 JVM이 헤더에 지정된 클래스를 로드합니다.이 클래스를 찾을 수 없으면readObject()에서 ClassNotFoundException을 던지고, 대상 데이터와 바이트 코드를 전송해야 한다면 RMI 프레임워크를 사용할 수 있습니다.ObjectInputStream의 나머지 방법은 사용자 정의 반서열화 프로세스에 사용됩니다.예는 다음과 같습니다
// string date
FileInputStream in = new FileInputStream ("tmp" );
ObjectInputStream s = new ObjectInputStream (in);
String today = (String )s.readObject();
Date date = (Date )s.readObject();
맞춤형 서열화 과정: 서열화는 일반적으로 자동으로 완성될 수 있지만 때로는 이 과정을 제어해야 할 수도 있다.java는 클래스를serializable로 선언할 수 있으나static 또는transient의 데이터 구성원으로 수동으로 제어할 수 있습니다.예: 매우 간단한 서열화 클래스..
public class simpleSerializableClass implements Serializable {
String sToday="Today:" ;
transient Date dtToday=new Date ();
}
서열화할 때, 클래스의 모든 데이터 구성원은transient나static로 성명된 구성원을 제외하고는 서열화할 수 있어야 한다.변수를 transient로 선언하고 JVM에 변원 서열화를 책임지겠다고 알려 줍니다.데이터 구성원을transient로 성명한 후 서열화 과정은 대상 바이트 흐름에 추가할 수 없으며transient 데이터 구성원으로부터 전송된 데이터가 없습니다.다음 데이터가 반서열화될 때, 데이터 구성원 (클래스 정의의 일부이기 때문에) 을 재구성해야 하지만, 이 데이터 구성원은 흐름에 데이터를 쓰지 않기 때문에, 어떤 데이터도 포함하지 않습니다.대상 흐름이 static이나transient를 서열화하지 않는다는 것을 기억하십시오.우리의 클래스는 이 데이터 구성원들을 처리하기 위해 writeObject () 와readObject () 방법을 사용해야 합니다.writeObject()와readObject() 방법을 사용할 때, 이 데이터 구성원들을 쓰기 순서대로 읽는 것을 주의해야 한다.사용자 정의 서열화된 일부 코드를 어떻게 사용하는지는 다음과 같다
// writeObject() transient 。
public void writeObject(ObjectOutputStream outputStream) throws IOException {
outputStream.defaultWriteObject();// writeObject()
// 。
outputStream.writeObject(oSocket.getInetAddress());
outputStream.writeInt(oSocket.getPort());
}
// readObject() transient 。
private void readObject(ObjectInputStream inputStream) throws IOException ,
ClassNotFoundException {
inputStream.defaultReadObject();//defaultReadObject()
InetAddress oAddress=(InetAddress )inputStream.readObject();
int iPort =inputStream.readInt();
oSocket = new Socket (oAddress,iPort);
iID=getID();
dtToday =new Date ();
}
완전 맞춤형 서열화 과정: 만약에 한 종류가 자신의 서열화를 완전히 책임지려면 Serializable 인터페이스가 아니라 Externalizable 인터페이스를 실현한다.Externalizable 인터페이스 정의는 writeExternal () 과 readExternal () 두 가지 방법을 포함합니다.이러한 방법을 이용하면 대상 데이터 구성원이 바이트 흐름을 어떻게 쓰는지 제어할 수 있다.클래스가 Externalizable를 실현할 때 헤더가 대상 흐름에 기록된 다음에 클래스는 데이터 구성원의 서열화와 복구를 책임진다. 헤더를 제외하고는 자동 서열화가 전혀 없다.여기 조심해야 돼.성명 클래스가 Externalizable 인터페이스를 실현하는 것은 중대한 안전 위험이 있을 것이다.writeExternal () 과readExternal () 방법은public로 선언되며, 악성 클래스는 이러한 방법으로 대상 데이터를 읽고 쓸 수 있습니다.객체에 민감한 정보가 포함되어 있는 경우 특히 조심해야 합니다.이것은 전체 바이트 흐름을 보안 플러그인을 사용하거나 암호화하는 것을 포함한다.여기까지 와서 우리는 서열화된 기초 부분 지식을 배웠다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.