我們有一個名為“Vehicle”的超類,它實作了標記介面 Serializable。然后我們有一個名為“Car”的子類,它繼承了“Vehicle”,因此子類“Car”也實作了Serializable標記介面,因為它是父“Vehicle”。
現在我們可以將任何車輛實體序列化為檔案,沒有任何問題。但是當我們嘗試將該檔案反序列化為“汽車”型別的物件時,程式會拋出例外。
我解決這個問題的方法是在“Car”類中手動實作 Serializable 標記介面。
為什么會這樣?從我今天閱讀的關于序列化的所有內容來看,似乎沒有人涉及這個問題。
我得出的結論是:“Car”類在繼承“Vehicle”類的同時,也繼承了“Vehicle”中實作的介面,因此“Car”物件是可序列化的,但是一旦我們序列化了一個實體將“Car”物件轉換為檔案(例如:“car1.ser”),“car1.ser”檔案中寫入了一個物件,其中包含所有的修飾符、屬性、方法等。但不知何故,型別的物件寫入“car1.ser”檔案的“Car”不會從其父級繼承“Serializable”標記。這是什么原因,我不太確定。
uj5u.com熱心網友回復:
什么例外?(請考慮將其添加到帖子中,因為它似乎是一個“重要細節”)
抱歉,無法重現/理解:
package com.example.serial;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class SerialTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Car car = new Car();
car.manufacturer = "Toyota";
car.model = "Land Cruiser";
// tmp memory:
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
// write object:
ObjectOutputStream oos = new ObjectOutputStream(outStream);
oos.writeObject(car);
// input stream of "tmp memory":
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
// read object:
ObjectInputStream ois = new ObjectInputStream(inStream);
Car c2 = (Car) ois.readObject();
// print/verify:
System.out.println(c2);
}
}
class Vehicle implements Serializable {
private static final long serialVersionUID = 0L;
String manufacturer;
}
class Car extends Vehicle {
String model;
}
印刷:
com.example.serial.Car@1ed6993a
我們還可以這樣做:
Vehicle car = new Car();
// ... same code, but without "model"
但不是:
Vehicle car = new Vehicle();
...
..這將導致:
java.lang.ClassCastException: class com.example.serial.Vehicle cannot be cast to class com.example.serial.Car
在這一行:
Car c2 = (Car) ois.readObject();
參考:https ://docs.oracle.com/en/java/javase/17/docs/specs/serialization/serial-arch.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/410312.html
標籤:
上一篇:為什么我在此代碼中出現歧義錯誤?
下一篇:洗掉后臺服務中的檔案
