인터페이스는 직접 직렬화할 수 없습니다. 그러나 비정적, 비일시적 필드를 포함하지 않거나 writeObject() 및 readObject() 메서드를 재정의하는 경우에만 추상 클래스를 직렬화할 수 있습니다. 인터페이스를 사용하거나 writeObject() 및 readObject() 메서드의 Abstract 클래스 구현을 재정의합니다.
소개
Java의 직렬화는 저장 또는 전송을 위해 객체를 바이트 시퀀스로 변환하는 프로세스입니다. 역직렬화는 바이트 시퀀스를 개체로 복원하는 역과정입니다. Java는 직렬화 가능
인터페이스를 구현하는 객체에 대해 내장된 직렬화 및 역직렬화 지원을 제공합니다. 그러나 인터페이스와 추상 클래스의 경우 상황이 다릅니다. Serializable
接口的对象,Java 提供了内置的序列化和反序列化支持。然而,对于接口和抽象类,情况却有所不同。
接口的序列化
接口本身不是对象,因此不能被序列化。要序列化和反序列化接口的实例,需要创建一个实现该接口的具体类,并确保该具体类实现 Serializable
接口。
// 接口 public interface Shape { // ... } // 具体类并实现 Serializable 接口 public class Circle implements Shape, Serializable { // ... }
抽象类的序列化
抽象类可以被序列化,前提是它们不包含任何非静态、非瞬态字段。如果一个抽象类包含非静态、非瞬态字段,那么它不能被序列化,除非显式地实现 writeObject()
和 readObject()
方法。
// 抽象类实现 Serializable 接口 public abstract class Animal implements Serializable { // ... // 覆盖 writeObject() 方法 private void writeObject(ObjectOutputStream out) throws IOException { // ... } // 覆盖 readObject() 方法 private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { // ... } }
实战案例
序列化
可以使用 ObjectOutputStream
类将对象序列化为字节序列。
// 创建 ObjectOutputStream 对象 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.ser")); // 序列化对象 out.writeObject(circle);
反序列化
使用 ObjectInputStream
인터페이스 직렬화
🎜🎜인터페이스 자체는 객체가 아니므로 직렬화할 수 없습니다. 인터페이스의 인스턴스를 직렬화 및 역직렬화하려면 인터페이스를 구현하는 구체적인 클래스를 만들고, 구체적인 클래스가직렬화 가능
인터페이스를 구현하는지 확인하세요. 🎜// 创建 ObjectInputStream 对象 ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.ser")); // 反序列化对象 Circle circle = (Circle) in.readObject();
writeObject()
및 readObject()
메서드가 명시적으로 구현되지 않으면 직렬화할 수 없습니다. 🎜rrreee🎜🎜실용 사례🎜🎜🎜🎜Serialization🎜🎜🎜 ObjectOutputStream
클래스를 사용하여 객체를 바이트 시퀀스로 직렬화할 수 있습니다. 🎜rrreee🎜🎜Deserialization🎜🎜🎜ObjectInputStream
클래스를 사용하여 바이트 시퀀스를 객체로 역직렬화합니다. 🎜rrreee🎜이러한 방식으로 인터페이스 및 추상 클래스의 인스턴스를 직렬화 및 역직렬화할 수 있습니다. 직렬화 및 역직렬화의 성공을 보장하려면 Java 직렬화 규칙을 따라야 합니다. 🎜위 내용은 Java의 인터페이스 및 추상 클래스 직렬화 및 역직렬화의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!