序列化+继承

一、序列化作用:

1系列化是干什么的?


       序列化简单来说就保存对象在内存中的状态也可以说是实例化变量。这是Java提供的用来保存 Object state,一种保存对象状态的机制。只有实现了serializable接口的类的对象才能被实例化。


2什么情况下会用到序列化?


     1当你想把内存中的对象写入到硬盘时

     2当你想用套接字在网络上传输对象时

     3当你想通过RMI调用对象时

    (RMI是什么东西?):RMI总结来说就是远程调用对象,在一个jvm上调用另一个jvm的对象。

 

3序列化需要注意的事项

     1序列化只保存对象的状态,而不管对象的方法。

     2当一个父类实现了序列化,它的子类也自动实现序列化,不用显示进行实现了。

     3当一个实例对象引用其他对象,当序列化该对象时也把引用的对象进行了实例化。

个人总结:serializable接口就是Java提供用来进行高效率的异地共享实例对象的机制,实现这个接口即可。

 

二、为一个实现Serializable接口的父类,编写一个能够序列化的子类 子类将自动的实现序列化 (序列化遇到继承)

为一个没有实现Serializable接口的父类,编写一个能够序列化的子类 1, 父类要有一个无参的constructor;2, 子类要先序列化自身,然后子类要负责序列化父类的域

父类实现了Serializable,子类不需要实现Serializable

  相关注意事项
    a)序列化时,只对对象的状态进行保存,而不管对象的方法;
    b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
    c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
    d)并非所有的对象都可以序列化,至于为什么不可以,有很多原因了,比如:
        1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行rmi传输等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。
       2. 资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分配,而且,也是没有必要这样实现。

例子: 

1,父类实现了Serializable,子类没有,

父类有int a = 1int b = 2int c = 3

子类有int d = 4int e = 5

序列化子类的时候,d和e会不会被序列化?(答案:会)

 

2,反过来父类未实现Serializable,子类实现了,序列化子类实例的时候,父类的属性是直接被跳过不保存,还是能保存但不能还原?(答案:值不保存)

 

解:父类实现接口后,所有派生类的属性都会被序列化。子类实现接口的话,父类的属性值丢失。

java中序列化之子类继承父类序列化

当一个父类实现Serializable接口后,他的子类都将自动的实现序列化。 

 

参考博客:http://www.yesky.com/376/1908876.shtml

  https://blog.youkuaiyun.com/liuxiao723846/article/details/52005532

转载于:https://www.cnblogs.com/lyqf/p/11124947.html

### 继承序列化的概念 继承序列化指的是当一个类派生自另一个序列化的基类时,子类不仅能够保存自身的成员变量到持久存储中,还可以自动处理来自父类的数据成员。这意味着,在执行序列化操作期间,整个对象图——包括超类部分以及当前实例特有的属性都将被记录下来;而在反序列化阶段,则会依据先前保存的信息重建完整的对象层次结构。 对于 Java 来说,只要确保所有参与其中的类都标记为 `Serializable` 接口即可完成这一功能[^1]。然而需要注意的是,默认机制下只会复制非瞬态(non-transient)、非静态字段的内容给子代节点。如果希望覆盖这种行为或者控制更精细粒度上的细节,开发者可以提供显式的 `writeObject()` 和 `readObject()` 方法来定制流程。 在 Hadoop 的 MapReduce 编程模型里,为了支持复杂的业务逻辑并提高灵活性,通常会让 bean 类遵循特定接口的要求以便于框架内部管理生命周期。例如实现了 `WritableComparable<T>` 或者仅仅是 `Writable` 接口之后,即使存在多层继承关系也依然可以通过标准 API 完成高效的数据交换工作[^2]。 至于基于 C++ 及其扩展库 Qt 开发的应用程序而言,虽然原生语言层面并没有像前者那样内置的支持方案,但是借助元对象系统 (Meta-Object System),仍然可以获得相当便捷的操作体验。通过注册相应的读取器/写入器函数并与信号槽机制相结合,即使是复杂嵌套的对象也可以轻松地转化为字节流形式加以存档或是网络传输[^3]。 ```cpp // 假设有一个简单的 BaseClass 已经具备基本的序列化能力 class Derived : public QObject, public BaseClass { Q_OBJECT public: explicit Derived(QObject *parent = nullptr); protected: void serialize(QDataStream &stream) const override; void deserialize(QDataStream &stream) override; private: int m_derivedData; // 子类特有数据项 }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值