当前位置: 首页 > 知识库问答 >
问题:

带继承的Java序列化

胡沈义
2023-03-14

问题:类A实现可序列化类B扩展了类A实现可序列化

现在我只使用类B作为运行时类型进行序列化。所以我有一个列表:

List<A> lst = new ArrayList<A>();
lst.add(new B());
...
objectOutputStream.writeObject(lst.get(i)); //this write compiler-type A, runtime-type B

如果我现在反序列化它,我就得到了java。伊奥。OptionalDataException错误。我想知道的是,我的对象如何成为正确的运行时类型。反序列化:

A a = (A) objectInputStream.readObject();

如果在序列化时是类B的运行时类型,这是否会导致类B的运行时类型,或者我必须覆盖A的earch子类的默认序列化?

希望我没有错过任何明显的事情。

提前感谢:)

编辑:

感谢所有的答案,它们真的帮助我理解了自己的错误。

引发异常是因为我(如回答)在中使用了。read(arr);这会导致无法完全读取数据,因此它无法正确地反序列化对象(当然不能)——在将其更改为readFully后,它会按预期工作。

共有2个答案

危砚
2023-03-14

好啊试试这个。。。。。。

1.首先是一个可序列化的标记/标记接口,它说这个类的对象是允许序列化的,当一个超级类是可序列化的时,它的子类将是自动可序列化的...所以不需要使扩展A的B是可序列化的。

2.现在,当您说使用readObject()读回对象时,它将是对象形式,这就是您需要将其转换为其类型的原因。

例如:

游戏玩家gp1=(游戏玩家)操作系统。readObject()//os是ObjectInputStream实例

楚瑞
2023-03-14

根据给定的信息,我无法确定您为什么会得到OptionalDataExctive。A是可序列化的,因此B将是可序列化的,因为B扩展了A。假设list.get(i)是对象B,那么对象输出tream.write对象(list.get(i))将把对象B写入流。当您读回它时,它将返回对象B。

类型擦除的参数无关紧要,因为方法ObjectOutputStream。writeObject接受Object作为参数。

您是否为类A或B定义了私有方法写入对象和读取对象?如果您定义了这些方法,请确保它们以正确的顺序读取和写入对象和原始数据。

 类似资料:
  • 问题内容: 假设您有Foo和Bar这两个类,其中Bar扩展了Foo并实现了 注意,Foo没有实现。那么当bar序列化时会发生什么? 它会显示“默认21”。问题是,为什么在未序列化类时调用默认构造函数? 问题答案: 可序列化只是给定类的“标记接口”。 但是该类必须遵守某些规则: http://docs.oracle.com/javase/1.5.0/docs/api/java/io/Serializ

  • 问题内容: 假设Java具有以下层次结构类: 这是C#中相同代码的(盲)重复: 当我执行Java代码时,我得到了C#返回的信息。 对我来说,C#的结果更有意义,因为引用B调用了它自己的方法。 Java设计者决定打印而不是打印的逻辑是什么?我的意思是,为什么引用B在C中使用覆盖方法?这种方法的优势是什么? 如何更改Java代码以像C#一样打印出来?我的意思是,我怎么教Java调用它使用的完全引用的方

  • 本小节我们将学习 Java 的继承,通过本小节的学习,你将知道什么是继承,继承有什么特点,如何实现继承,方法重写的概念和实现,方法重写和方法重载是比较容易混淆的概念,我们也会介绍两个概念的区别,这些都是本小节的重点,本小节的最后我们还会介绍 super 关键字以及 final 关键字。 1. 概念和特点 1.1 概念 继承是面向对象软件技术当中的一个概念。如果一个类别 B “继承自” 另一个类别

  • 问题内容: 我正在开发一个使用angular作为客户端框架的应用程序,目前使用angular作为岩石,我真的很高兴,尽管现在我发现我经常复制和粘贴要组织成类层次结构的代码。例如,对话框共享一组通用的功能,需要打开,关闭它们,提供功能的代码也是从某些父BaseTypeaheadClass继承的首选对象,尽管我在angular中没有发现的一件事是组织这些层次结构。控制器,服务和提供者都在下面使用普通的

  • 我有一个简单的Json结构,比如: 我设计了以下类来反序列化它: 我需要将反序列化分为两个阶段: 1-反序列化以读取。 2.2基于MessageType进行其余的反序列化 代码很简单: 我的程序可以输入正确的(即),但它不能正确解析它(println打印0而不是12) 你觉得我哪里做错了?谢谢你们

  • 我试图弄清楚Java中的继承和数组,并试图让这些类一起工作。我相信我已经继承下来了,但我仍在为数组部分而挣扎。 有三个文件: 1. Person.java-基类2. Student.java-派生的Person.java3. Family.java-不太确定,我认为这是它自己的基类 人java有两个实例变量,String name和int age,以及各种各样的构造函数toString、equal