인터페이스 java.io.Serializable 상세 요약

5537 단어 java
1、java.io.Serializable는 서열화를 나타내는 빈 인터페이스이다. 즉, 이 인터페이스는 어떤 방법도 설명하지 않기 때문에 이 인터페이스를 실현하는 클래스는 어떤 방법도 실현할 필요가 없다.
2. 서열화는 대상을 바이트 흐름(서열화)으로 인코딩하고 바이트 흐름에서 인코딩하여 대상을 재구성하는 데 사용된다.원격 통신으로 서열화되어 표준적인wire-level 프로토콜을 제공하였다.
시리얼화란 무엇입니까?
서열화는 한 대상의 상태(각 속성량)를 저장한 다음에 적당한 때에 얻는 것이다.
서열화는 두 부분으로 나뉘는데 그것이 바로 서열화와 반서열화이다.서열화는 이 과정의 첫 번째 부분으로 데이터를 바이트 흐름으로 분해하여 파일에 저장하거나 네트워크에서 전송하도록 한다.반서열화는 바이트 흐름을 열고 대상을 재구성하는 것이다.대상 서열화는 기본 데이터 형식을 바이트 표시로 변환해야 할 뿐만 아니라, 때로는 데이터도 복원해야 한다.
3. 클래스의 실례를 서열화하려면 그 성명에implementsjava를 추가하면 된다.io.Serializable이지만 일부 위험1이 서열화를 실현한 후에 발표되면 변경류 실현의 유연성을 약화시킨다.2는 버그와 보안 빈틈의 가능성을 증가시켰다. 3은 새 버전이 발표될 때 관련 테스트에 대한 문제를 증가시켰다.이 인터페이스는 모든 실현 클래스에 특수한 (mixin) 유형을 가지게 하여 JVM이 이 클래스가 안전하게 직렬화될 수 있음을 알게 한다.
4. 만약에 Bean의 실례를 네트워크를 통해 전송하거나 디스크 파일에 쓸 필요가 있다면 Serializable 인터페이스를 실현하는 것이 가장 간단합니다. ObjectInputStream, ObjectOutputStream을 통해 직접 읽거나 쓸 수 있습니다.
유용성:
1: 대상의 서열화는 분포식 대상을 실현할 수 있다.
주요 응용 프로그램: RMI는 대상을 이용하여 원격 호스트의 서비스를 서열화하여 로컬 컴퓨터에서 대상을 실행할 때와 같이 실행해야 한다.
2. 자바 대상의 서열화는 한 대상의 데이터를 보존할 뿐만 아니라 대상이 인용한 모든 대상의 데이터를 저장한다.바이트 흐름에 전체 대상 단계를 쓸 수 있으며 파일에 저장하거나 네트워크에 저장할 수 있습니다
연결 전송.대상의 서열화를 이용하여 대상의'심도 복제', 즉 대상 자체와 인용된 대상 자체를 복제할 수 있다.하나의 대상을 서열화하면 전체 대상의 서열을 얻을 수 있습니다.
EP:
import java.io.Serializable;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
class MeTree implements Serializable {
private static final long serialVersionUID = 42L;
public MeTree left;
public MeTree right;
public int id;
public int level;
private static int count  =   0 ; 

public  MeTree( int  depth)   {

      id  = count ++ ;

      level  =  depth;

     if  (depth  >   0 )   {



        left  =   new  MeTree(depth - 1 );

        right  =   new  MeTree(depth - 1 );

    } 

 }



 public   void  print( int  levels)   {

     for  ( int  i  =   0 ; i  <  level; i ++ ) {

        System.out.print( "    " );

    System.out.println( " node  "   +  id);



     if  (level  <=  levels  &&  left  !=   null )

        left.print(levels); 

     if  (level  <=  levels  &&  right  !=   null )

        right.print(levels);

     }

 }



 public   static   void  main (String argv[])   {

     try    {

         /**/ /*             。 */ 

        FileOutputStream ostream  =   new  FileOutputStream( " MeTree.tmp " );

         /**/ /*       */ 

        ObjectOutputStream p  =   new  ObjectOutputStream(ostream);

         /**/ /*         。 */ 

        MeTree base  =   new  MeTree( 2 );

        p.writeObject(base);  //       。

         p.writeObject( " LiLy is      " );

        p.flush();

        ostream.close();     //     。



          /**/ /*               。 */ 

        FileInputStream istream  =   new  FileInputStream( " MeTree.tmp " );

        ObjectInputStream q  =   new  ObjectInputStream(istream);

         /**/ /*      ,       */ 

        MeTree new_MeTree  =  (MeTree)q.readObject();

        new_MeTree.print( 2 );   //             2 

         String name  =  (String)q.readObject();

        System.out.println( " /n " + name);

    }   catch  (Exception ex)   {

        ex.printStackTrace();

    } 

 }

}
서열화할 때 write Object와readObject 사이의 선후 순서를 볼 수 있습니다.readObject는 가장 먼저 write의 object read를 내보냅니다.데이터 구조의 용어로 말하자면 우선 선진선출이라고 하자!
서열화할 때 주의해야 할 몇 가지가 있다.
1: 객체가 시리얼화된 경우 객체의 비정상적 구성원 변수만 저장하고 구성원 메서드와 정적 구성원 변수는 저장할 수 없습니다.
2: 만약에 대상의 구성원 변수가 하나의 대상이라면 이 대상의 데이터 구성원도 저장될 것이다.
3: 시리얼화된 객체가 시리얼화되지 않은 객체에 대한 참조를 포함하는 경우 전체 시리얼화 작업이 실패하고 NotSerializable Exception이 제거됩니다.우리는 이 인용을transient로 표시할 수 있으며, 대상은 여전히 서열화될 수 있다
그리고 우리가 특정한 대상을 서열화할 때 종종 전체 대상을 서열화한다. 예를 들어 클래스 안의 일부 데이터는 비교적 민감해서 서열화를 원하지 않는다. 한 방법은transient로 표시할 수 있고 다른 방법은 클래스에서 다시 쓸 수 있다.
관건transient를 지정하여 대상 중의 어떤 데이터 요소를 복원하지 못하게 할 수 있습니다. 이런 방식은 항상 안전한 보호에 사용됩니다.예를 들어 대상에 저장된 비밀번호.
//**
transient는 클래스의 구성원 변수에만 사용할 수 있고 방법에는 사용할 수 없습니다.
transient 변수는final과static가 될 수 없습니다
transient(임시) 키워드
서열화 과정을 제어할 때, 특정한 하위 대상이 자바의 서열화 메커니즘을 자동으로 저장하고 복구하기를 원하지 않을 수도 있습니다.일반적으로 그 하위 대상이 서열화되고 싶지 않은 민감한 정보(예를 들어 비밀번호)를 포함한다면 이런 상황에 직면하게 된다.비록 그 정보는 대상에 'private' (사유) 속성을 가지고 있지만, 일단 서열화 처리를 거치면, 사람들은 파일을 읽거나 네트워크 전송을 차단해서 그것을 얻을 수 있다.
대상의 민감한 부분이 서열화되는 것을 방지하기 위해 자신의 클래스를 앞에서 보여준 것처럼 Externalizable로 실현하는 방법이 있다.이렇게 되면 어떤 것도 자동으로 서열화할 수 없고, writeExternal () 에서만 필요한 부분을 명확하게 서열화할 수 있다.
그러나 Serializable 객체로 작업하면 모든 서열화 작업이 자동으로 수행됩니다.이 문제를 해결하기 위해
transient (임시) 를 사용하여 한 필드 한 필드 서열화를 닫을 수 있습니다. 이것은 "저장하거나 복구하는 것을 귀찮게 하지 마십시오. 제가 알아서 처리하겠습니다."라는 뜻입니다.
예를 들어, Login 객체에 특정 로그인 세션에 대한 정보가 포함되어 있다고 가정합니다.로그인의 합법성을 검사할 때, 일반적으로 데이터를 저장하려고 하지만, 비밀번호는 포함되지 않습니다.
이를 위해 가장 간단한 방법은serializable를 실현하고password 필드를transient로 설정하는 것입니다.
password는transient로 설정되어 있으며,
따라서 디스크에 자동으로 저장되지 않습니다.또 자동 서열화 메커니즘도 복구를 시도하지 않을 것이다.
대상이 원래의 모습으로 돌아오면password 필드는null로 변합니다.패스워드가 null인지 확인하려면 tostring () 을 사용해야 합니다. 만약 과부하된 '+' 연산자로 String 대상을 조립하고, 그 연산자가 null 핸들을 만나면, Null Pointer Exception이라는 위례를 초래할 수 있기 때문입니다. (새 자바는 이 문제를 피하는 코드를 제공할 수 있습니다.)
우리도 날짜 필드가 디스크에 저장되어 있고 디스크에서 복구되어 다시 생성되지 않은 것을 발견했다.
Externalizable 대상은 기본적으로 필드를 저장하지 않기 때문에transient 키워드는 Serializable와 함께 사용할 수 있습니다.
**//그리고 우리가 어떤 대상을 서열화할 때
전체 대상이 모두 서열화되었다. 예를 들어 클래스 안의 일부 데이터가 비교적 민감해서 서열화를 원하지 않는다. 한 방법은transient로 표시할 수 있고 다른 방법은 클래스에서 다시 쓸 수 있다.

좋은 웹페이지 즐겨찾기