이 글의 내용은 Java에서 객체의 직렬화 및 역직렬화를 구현하는 방법에 관한 것입니다. (두 가지 방법) 특정 참고 가치가 있습니다. 도움이 필요한 친구가 참고할 수 있기를 바랍니다.
직렬화는 객체의 상태 정보를 저장하거나 전송할 수 있는 형식으로 변환하는 과정입니다. 직렬화 중에 객체는 자신의 과거 상태를 임시 또는 영구 저장소에 쓰고 역직렬화하는 과정입니다. 임시 또는 영구 저장소에서 객체를 다시 생성하는 것입니다.
예를 들어, 데이터베이스에 데이터를 저장하고, 일부 데이터를 데이터베이스에 유지하며, 때로는 객체를 유지해야 하는 경우도 있지만 객체 상태를 유지하는 방법은 여러 가지가 있지만 Java는 매우 유용한 기능을 제공합니다. 편리한 방법, 즉 직렬화는 객체와 파일 간의 직접 변환을 실현할 수 있으며 구현 세부 사항은 우리에게 숨겨집니다.
세 가지 구체적인 용도:
객체의 상태 정보를 하드 디스크에 지속적으로 저장
네트워크에서 객체 정보 전송
심층 복제(직렬화 후 역직렬화)
을 통해 직렬화 가능 인터페이스를 구현하고, 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(); } }
외부화 가능 인터페이스는 직렬화 가능 인터페이스를 상속하고 직렬화용과 역직렬화용으로 하나씩 두 가지 메소드를 캡슐화합니다. 이 메소드는 속성을 직렬화합니다. 즉, 임시 수정자는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!