Java 서열화 상세 설명 및 간단한 구현 실례

5902 단어 Java서열화
1. 서열화
서열화 정의: 서열화는 대상의 상태를 유지하거나 전송할 수 있는 형식으로 바꾸는 과정이다.서열화와 상대적으로 반서열화는 흐름을 대상으로 변환한다.이 두 과정을 결합하면 데이터를 쉽게 저장하고 전송할 수 있다.
목적:
  • 특정한 저장 형식으로 사용자 정의 대상을 지속시킨다
  • 대상을 한 곳에서 다른 곳으로 전달한다
  • 2. Java 정렬화
    하나의 대상이 서열화될 수 있는 전제는 Serializable 인터페이스를 실현하는 것이다.Serializable 인터페이스는 방법이 없고 표기 같습니다.이 표시된 클래스가 있으면 서열화 메커니즘으로 처리될 수 있습니다.다음과 같습니다.
    
    class myPoint implements Serializable{ 
    } 
     
    JAVA 반서열화는 어떤 구조기도 호출하지 않습니다
    서열화된 제어: Externalizable.읽기와 쓰기는 모두 너에게 맡기겠다
  • 방법 writeExternal에서 서열화된 매개 변수를 써야 합니다
  • 방법readExternal에서 반서열화된 값을 읽어야 합니다
  • 기본 구조 방법이 있어야 한다(readExternal 실행 완료, 기본 구조기 실행)
  • 
    void writeExternal(ObjectOutput out) throws IOException; 
    void readExternal(ObjectInput in) throws IOException,ClassNotFoundException; 
    public class Point implements Externalizable { 
      private int a; 
      private int b; 
      public Point(int a, int b) { 
        this.a = a; 
        this.b = b; 
      } 
      public Point() { 
      } 
      public String toString() { 
        return a + " , " + b; 
      } 
       
      public void writeExternal(ObjectOutput out) throws IOException { 
        out.write(a); 
        out.write(b); 
      } 
      public void readExternal(ObjectInput in) throws IOException, 
          ClassNotFoundException { 
        a = in.read(); 
        b = in.read(); 
      } 
      public static void main(String[] args) throws IOException, 
          ClassNotFoundException { 
        String file = "d://1.txt"; 
        Point p = new Point(1, 2); 
        System.out.println(p); 
        FileOutputStream fos = new FileOutputStream(file); 
        ObjectOutputStream oos = new ObjectOutputStream(fos); 
        oos.writeObject(p); 
        FileInputStream fis = new FileInputStream(file); 
        ObjectInputStream ois = new ObjectInputStream(fis); 
        Point pp = (Point) ois.readObject(); 
        System.out.println(pp); 
      } 
    } 
     
    
  • transient 키워드 닫기 서열화 자동 진행..
  • 어떤 서열화 형식을 선택하든지 간에 자신이 작성한 서열화 가능한 클래스마다 표시되는 서열 버전 UID(serial version UID)를 설명해야 한다.
  • 3. 서열화된 문제
    effective Java에서 자바 서열화에 주의해야 할 몇 가지 문제를 열거했다.
    1. Serializable 인터페이스를 신중하게 설계
  • 발표를 실현하는 것은 일종의 약속이다
  • 만약에 하나의 클래스가 계승을 위해 설계된 것이라면'하위 클래스의 Serializable 인터페이스 실현 허용'과'하위 클래스의 Serializable 인터페이스 실현 금지'에서 절충된 방안은 접근 가능한 무참구조기를 제공하는 것이다
  • 2.readObject() 방법을 보호적으로 작성합니다.readObject()는 구축 실례의 입구이기 때문입니다.
    보호되지 않으면 요구에 부합되지 않는 실례가 생길 수 있다
    3. 사용자 정의 서열화 형식을 고려
  • 논리적 내용과 물리적 표현법
  • 만약에 하나의 대상의'물리적 표현'이 그것의'논리적 내용'과 같다면 기본적인 서열화 형식을 사용하는 데 적용될 수 있다
  • 만약에 더 좋은'물리적 표현법'이'논리적 내용'을 표시하고 있다면 서열화 형식을 사용자 정의할 수 있다..
  • 
    public class StringList implements Serializable { 
      private transient int size = 0; 
      private transient Entity head = null; 
      public final void add(String str) { 
        // ... 
      } 
      private static class Entity { 
        String data; 
        Entity next; 
        Entity previous; 
      } 
      private void writeObject(ObjectOutputStream s) throws IOException { 
        s.defaultWriteObject(); 
        s.write(size); 
        for (Entity e = head; e != null; e = e.next) { 
          s.writeObject(e.data); 
        } 
      } 
      private void readObject(ObjectInputStream s) throws IOException, 
          ClassNotFoundException { 
        s.defaultReadObject(); 
        int num = s.read(); 
        for (int i = 0; i < num; i++) { 
          this.add((String) s.readObject()); 
        } 
      } 
    } 
     
    
    4. 서열화 프록시 모드
    서열화 메커니즘이 제공하는 갈고리 함수는 다음과 같다.
           writeReplace writeObject  readObject  readResolve
  • writeReplace: 서열화할 때 서열화할 대상을 바꿉니다..
  • writeObject: 서열화된 객체를 기록합니다
  • readObject: 서열화된 대상을 읽습니다
  • readResolve: 마지막으로 서열화된 객체를 반환합니다
  • 
    import java.io.InvalidObjectException; 
    import java.io.ObjectInputStream; 
    import java.io.Serializable; 
    import java.util.Date; 
    public final class Period implements Serializable { 
      private static final long serialVersionUID = 100L; 
      private final Date start; 
      private final Date end; 
      public Period(Date start, Date end) { 
        this.start = new Date(start.getTime()); 
        this.end = new Date(end.getTime()); 
        if (this.start.compareTo(this.end) > 0) { 
          throw new IllegalArgumentException(start + " after " + end); 
        } 
      } 
      public Date start() { 
        return new Date(start.getTime()); 
      } 
      public Date end() { 
        return new Date(end.getTime()); 
      } 
      public String toString() { 
        return start + " - " + end; 
      } 
      //   
      private Object writeReplace() { 
        return new SerializationProxy(this); 
      } 
      private void readObject(ObjectInputStream stream) 
          throws InvalidObjectException { 
        throw new InvalidObjectException("proxy request"); 
      } 
      private static class SerializationProxy implements Serializable { 
        private final Date start; 
        private final Date end; 
        SerializationProxy(Period p) { 
          this.start = p.start; 
          this.end = p.end; 
        } 
        private Object readResolve() { 
          return new Period(start, end); 
        } 
        private static final long serialVersionUID = 1000L; 
      } 
    }  
    
    5. 서열화 알고리즘
  • 대상의 실례와 관련된 클래스 데이터를 출력..
  • 더 이상 클래스가 없을 때까지 클래스를 반복적으로 출력합니다
  • 클래스 데이터가 끝난 후, 맨 윗부분의 초클래스부터 대상 실례의 실제 데이터 값을 출력하기 시작합니다
  • 위에서 아래로 출력된 실례의 데이터를 귀속한다
  • 읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

    좋은 웹페이지 즐겨찾기