子類可序列化為文件,但該文件不可反序列化

我們有一個名為“Vehicle”的超類,它實現了marker接口Serializable。然后我們有一個名為“Car”的子類,它繼承了“Vehicle”,因此子類“Car”也實現了可序列化標記接口,因為它的父類是“Vehicle”。

現在,我們可以將車輛的任何實例序列化為文件,而不會出現任何問題。但是,當我們嘗試將該文件反序列化為“Car”類型的對象時,程序會拋出一個異常。

我解決這個問題的方法是在“Car”類中手動實現可序列化標記接口。

為什么會這樣?從我今天在連載上讀到的所有東西來看,似乎沒有人涉及這個問題。

我得出的結論是:當“Car”類繼承“Vehicle”類時,它也繼承了“Vehicle”中實現的接口,因此“Car”對象是可序列化的,但是一旦我們將“Car”對象的一個實例序列化到一個文件中(例如:"car1.ser"),"car1.ser“文件有一個對象被寫入它,其中包含它的所有修飾符、屬性、方法等。但不知怎的,寫入"car1.ser”文件的“Car”類型的對象并不繼承“Serializable”來自其父對象的標記。原因是什么,我不太清楚。

? 最佳回答:

什么例外?(請考慮將其添加到帖子中,因為它看起來像是一個“重要的細節”)。

抱歉,無法re-produce/comprehend:

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;
}

Prints:

com.example.serial.Car@1ed6993a

我們還可以做到:

Vehicle car = new Car();
// ... same code, but without "model"

But not:

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();

Reference: https://docs.oracle.com/en/java/javase/17/docs/specs/serialization/serial-arch.html

主站蜘蛛池模板: 亚洲av成人一区二区三区| 久久亚洲色一区二区三区| 国精产品一区一区三区有限公司| 无码精品国产一区二区三区免费| 性无码一区二区三区在线观看| 精品国产伦一区二区三区在线观看| 呦系列视频一区二区三区| 波多野结衣精品一区二区三区| 一区二区三区四区无限乱码 | 亚洲香蕉久久一区二区三区四区| 成人精品一区二区户外勾搭野战| 国产在线视频一区二区三区| 中文字幕亚洲一区二区va在线| 91大神在线精品视频一区| 天堂Av无码Av一区二区三区| 一区二区三区波多野结衣| 国产成人无码一区二区三区| 日本一区二区三区不卡视频| AV天堂午夜精品一区| 亚洲av无码成人影院一区| 波多野结衣的AV一区二区三区 | 亚洲综合av一区二区三区| 内射白浆一区二区在线观看 | 国产乱码精品一区二区三区中| 日韩免费无码一区二区视频| 免费av一区二区三区| 成人精品视频一区二区| 丰满爆乳一区二区三区| 在线精品一区二区三区电影| 国产无码一区二区在线| 亚洲一区二区三区日本久久九| 国产一区二区影院| 亚洲一区二区三区久久| 成人影片一区免费观看| 国产精品无码一区二区三区在| 人妻aⅴ无码一区二区三区| 国产精品免费一区二区三区| 在线免费一区二区| 亚洲一区二区三区免费观看| 国产亚洲一区二区精品| 无码毛片一区二区三区中文字幕|