Java에서 객체의 직렬화 및 역직렬화를 구현하는 방법은 무엇입니까? (두 가지 방법)

不言
풀어 주다: 2018-10-10 11:04:58
앞으로
2978명이 탐색했습니다.

이 글의 내용은 Java에서 객체의 직렬화 및 역직렬화를 구현하는 방법에 관한 것입니다. (두 가지 방법) 특정 참고 가치가 있습니다. 도움이 필요한 친구가 참고할 수 있기를 바랍니다.

소개:

직렬화는 객체의 상태 정보를 저장하거나 전송할 수 있는 형식으로 변환하는 과정입니다. 직렬화 중에 객체는 자신의 과거 상태를 임시 또는 영구 저장소에 쓰고 역직렬화하는 과정입니다. 임시 또는 영구 저장소에서 객체를 다시 생성하는 것입니다.

직렬화의 역할:

예를 들어, 데이터베이스에 데이터를 저장하고, 일부 데이터를 데이터베이스에 유지하며, 때로는 객체를 유지해야 하는 경우도 있지만 객체 상태를 유지하는 방법은 여러 가지가 있지만 Java는 매우 유용한 기능을 제공합니다. 편리한 방법, 즉 직렬화는 객체와 파일 간의 직접 변환을 실현할 수 있으며 구현 세부 사항은 우리에게 숨겨집니다.

세 가지 구체적인 용도:

객체의 상태 정보를 하드 디스크에 지속적으로 저장

네트워크에서 객체 정보 전송

심층 복제(직렬화 후 역직렬화)

방법 1: 구현 직렬화 가능 인터페이스 , 직렬화 스트림

을 통해 직렬화 가능 인터페이스를 구현하고, ObjectOutputStream 및 ObjectInputStream을 통해 객체를 직렬화 및 역직렬화합니다.

import java.io.*;
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
//        User user = new User("gol",22);
//        ByteArrayOutputStream bo = new ByteArrayOutputStream();
//        ObjectOutputStream oo = new ObjectOutputStream(bo);
//        oo.writeObject(user);//序列化.user写入字节数组流中
//        ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
//        ObjectInputStream oi = new ObjectInputStream(bi);
//        User userSer = (User) oi.readObject();//反序列化
//        System.out.println(userSer);
        User user = new User("gol",22);
        FileOutputStream fos = new FileOutputStream("a.txt");
        ObjectOutputStream oo = new ObjectOutputStream(fos);
        oo.writeObject(user);//序列化.user写入文件中
        FileInputStream fis = new FileInputStream("a.txt");
        ObjectInputStream oi = new ObjectInputStream(fis);
        User userSer = (User) oi.readObject();//反序列化
        System.out.println(userSer);
        oi.close();
        fis.close();
        oo.close();
        fos.close();
    }
}
로그인 후 복사

방법 2: 외부화 가능 인터페이스 구현 및 writeExternal 및 readExternal 메소드 재작성

외부화 가능 인터페이스는 직렬화 가능 인터페이스를 상속하고 직렬화용과 역직렬화용으로 하나씩 두 가지 메소드를 캡슐화합니다. 이 메소드는 속성을 직렬화합니다. 즉, 임시 수정자는 writeExternal 메소드에서 속성을 직렬화하는 한 계속해서 직렬화됩니다.

import java.io.*;
public class User implements Externalizable {
    private static final long serialVersionUID = 1L;
    private  String name;
    private  int age;

    public User() {
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(this.name);//将属性分别序列化
        out.writeObject(this.age);
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        this.name=(String)in.readObject();//反序列化属性
        this.age=(int)in.readObject();
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        FileOutputStream fos = new FileOutputStream("a.txt");
        ObjectOutputStream oo = new ObjectOutputStream(fos);
        FileInputStream fis = new FileInputStream("a.txt");
        ObjectInputStream oi = new ObjectInputStream(fis);
        User user = new User("gol",19);
        user.writeExternal(oo);//序列化
        User userEnr = new User();
        userEnr.readExternal(oi);//反序列化
        System.out.println(userEnr);
        oi.close();
        fis.close();
        oo.close();
        fos.close();
    }
}
로그인 후 복사

요약:

다음 세 가지 사항에 주의하세요.

직렬화 가능 인터페이스는 클래스가 직렬화될 수 있음을 식별하는 데 사용되는 표시 인터페이스이자 빈 인터페이스입니다.

transient는 속성 수정자이며 이에 의해 수정된 속성은 직렬화되지 않습니다. 그러나 방법 2를 사용하면 속성 직렬화도 직렬화될 수 있음을 분명히 명시합니다.

serialVersionUID 속성은 클래스의 직렬화 ID입니다. 직렬화된 객체와 역직렬화된 객체의 serialVersionUID 속성이 다른 경우 오류가 보고됩니다.

위 내용은 Java에서 객체의 직렬화 및 역직렬화를 구현하는 방법은 무엇입니까? (두 가지 방법)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:cnblogs.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿