Java I/O 전체 텍스트 요약 (13) 필터 흐름, 대상 직렬 화

5188 단어 JavaSEJavaIOJava
1 개체 서열 화
Object InputStream 과 Object OutputStream 이 구현 되 었 습 니 다. DataInput 과 DataOutput
사용 방법:
writeObject( ) 화해시키다 readObject( )
2 읽 기와 쓰기 대상
대상 의 상태 정 보 를 저장 하면 어느 순간 복구 할 수 있 습 니 다.
건장 하고 신뢰 할 수 있 으 며 안전 한 서열 화 는 일 을 복잡 하 게 만든다.
3 류
public class ObjectOutputStream extends OutputStream
  implements ObjectOutput, 
 ObjectStreamConstants
public class ObjectInputStream extends InputStream
  implements ObjectInput, ObjectStreamConstants


두 가지 방법:
public final void writeObject(Object o) throws IOException

public final Object readObject( )
  throws OptionalDataException, ClassNotFoundException, IOException

4. 어떻게 일 하 는 지 서열 화
한 가지 문 제 를 고려 하 다.
만약 당신 에 게 한 가지 종류 가 있다 면, 안에 있 습 니 다.
private double x;
private double y;

당신 이 해 야 할 저장 작업 은:
DataOutputStream dout = new DataOutputStream(out);
    dout.writeDouble(x);
    dout.writeDouble(y);

대응 하 는 읽 기 작업 은:
DataInputStream din = new DataInputStream(in);
    this.x = din.readDouble( );
    this.y = din.readDouble( );

이 모든 것 은 매우 간단 해 보이 지만,
그러나 한 대상 이 다른 대상 을 포함 하거나 더 무 서운 것 은 순환 인용 이 있 을 때 문제 가 복잡 해진 다 는 것 이다.
다행히 sun 회 사 는 이 모든 것 을 처리 해 주 었 습 니 다. 대상 의 모든 비 정적 비 순간 필드 를 저장 하고 특수 한 파일 에 저장 할 것 입 니 다.
5 성능
직렬 화 는 편리 하지만 성능 을 소모 한다.
스스로 정의 할 수 있다 면, 스스로 형식 을 정의 하 는 것 이 가장 좋다.
그 다음으로 서열 화 는 쓰레기 수집 을 늦 추거 나 조직 할 것 이다
스 트림 은 대상 의 인용 을 가지 고 있 을 수 있 으 며, 스 트림 이 닫 히 지 않 았 을 수도 있 으 며, 이 로 인해 대상 은 소지 자 를 강하 게 인용 해 왔 다.
6 직렬 화 인터페이스
방문 대상 의 개인 인 터 페 이 스 를 직렬 화하 기 때문에 안전 하지 않 습 니 다.
그 다음 에 적절 하지 않 은 대상 을 직렬 화 합 니 다. 예 를 들 어 Socket 대상 은 직렬 화 되 어 저 장 된 다음 에 다른 프로그램 에서 반 직렬 화 되 고 연결 이 더 이상 되 지 않 으 면 문제 가 발생 할 것 입 니 다.
그래서 모든 종류 가 서열 화 되 어야 하 는 것 은 아니다.
서열 화 를 필요 로 하 는 클래스 는 반드시 실현 되 어야 한다.
인터페이스
주의해 야 할 것 은 부모 류 가 이 인 터 페 이 스 를 실현 하면 자 류 는 다시 설명 할 필요 가 없다 는 것 이다.
예 를 들 면:
java.lang.Throwable
7. 서열 화 되 어 서 는 안 되 는 대상
자바. lang. Throwable 은 항상 직렬 화 되 어야 하지만.그러나 서열 화 되 지 말 아야 할 종류 가 더 많다.
예 를 들 어 흐름, 자바 빈 스, 운영 체제 의존, 도구 류, 반사.
대상 이 서열 화 되 지 않 는 7 가지 이유:
1. natvie 코드 와 긴밀 하 게 연결
2. 대상 상 태 는 가상 컴퓨터 또는 운영 환경 과 관련 이 있다.
3. 직렬 화 는 잠재 적 인 안전 위험 이 있다.
4. 클래스 는 정적 인 방법 만 있 습 니 다.
5. 클래스 는 비정 상 내부 클래스 입 니 다.
6. 프로그램 을 작성 하 는 프로그래머 가 직렬 화 를 고려 하지 않 음
7. 직렬 화 를 대체 하 는 더 좋 은 방법 이 있다 (예 를 들 어 XML 에 저장)
8. 서열 화 이상 없 음
직렬 화 인터페이스 가 실현 되 지 않 은 클래스 를 직렬 화하 면 던 집 니 다.
public interface Serializable

문제 가 될 수 있 는 원인:
1. 비 직렬 화 대상 을 인용 했다.
2. 부계 무 참 구조 방법 은 존재 하지 않 습 니 다.
처리 방법:
try -catch
또는 transient 대응 변수.
질문
한 대상 을 서열 화하 기 때문에 대상 이 반 서열 화 될 때 처 한 환경 에 큰 변화 가 생 길 수 있다.예 를 들 어 필드 추가 삭제 수정, 방법의 변화, 수정자 의 변화 등 이다.
특히 정적 변수 수정 은 직렬 화 에 영향 을 주지 않 고 transient 도 할 수 없 지만 transient 가 아 닌 인 스 턴 스 변수의 수정 은 직렬 화 에 영향 을 줄 수 있다.
그래서 버 전 에 따라 서열 화 되 는 문 제 를 고려 해 야 한다.
10 호환성 과 비 호환성 변화
다음 변경 사항 은 호 환 되 지 않 습 니 다.
  • Most changes to constructors and methods, whether instance or static. Serialization doesn't touch the methods of a class. The exceptions are those methods directly involved in the serialization process, particularlywriteObject( ) and readObject( ).
  • All changes to static fieldschanging their type, their names, adding or removing them, etc. Serialization ignores all static fields.
  • All changes to transient fieldschanging their type, their names, adding or removing them, etc. Serialization ignores all transient fields.
  • Adding or removing an interface (except the Serializable interface) from a class. Interfaces say nothing about the instance fields of a class.
  • Adding or removing inner classes.
  • Changing the access specifiers of a field. Serialization does not respect access protection.
  • Changing a field from static to nonstatic or transient to nontransient. This is the same as adding a field.

  • The following changes are incompatible and thus prevent deserialization of serialized objects:
  • Changing the name of a class.
  • Changing the type of an instance field.
  • Changing the superclass of a class. This may affect the inherited state of an object.
  • Changing the writeObject( ) or readObject( ) method (discussed later) in an incompatible fashion.
  • Changing a class from Serializable to Externalizable (discussed later) orExternalizable to Serializable.

  • 같은 버 전인 지 확인 하기 위해 SUID 를 생 성 했다.
    그것 은 이렇게 생 겼 다.
    public class NotSerializableException extends ObjectStreamException
    

    11 사용자 정의 직렬 화 형식
    가장 간단 한 사용자 정의 방법 은 trasient 를 추가 할 것 인 가 를 결정 하 는 것 입 니 다.
    더 많이 하려 면 readObject () and writeObject () 를 다시 쓰 세 요.
    또는 자바. io. Externalizable 을 실현 하여 직렬 화 에 대한 완전한 통 제 를 실현 할 수 있 습 니 다.
    Externalizable 은 두 가지 방법 을 추가 로 제공 합 니 다.
    4. 567913. 더욱 정확 한 통 제 를 제공 했다.
    12 합 법성 검증
    저장 값 의 상태 가 매우 부족 합 니 다. 그것 을 검증 해 야 합 니 다.
    13 패키지 대상
    직렬 화 대상 에 대한 암호 화 를 제공 합 니 다.
    serialVersionUID = 5590355372728923878,

    좋은 웹페이지 즐겨찾기