`
cakin24
  • 浏览: 1384474 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

序列化中子父类构造函数问题

    博客分类:
  • java
阅读更多
一 介绍
1、如果父类实现了序列化接口,子类就不需要实现序列化接口。
2、创建对象的时候,递归调用了父类的构造函数。
3、对子类对象进行反序列化操作时,如果其父类没有实现序列化接口,那么其父类的构造函数会被调用,否则不会被调用。
 
二 实例
package com.imooc.io;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
 
public class ObjectSeriaDemo2 {
    public static void main(String[] args) throws Exception{
         ObjectOutputStream oos = new ObjectOutputStream(
                 new FileOutputStream("demo/obj1.dat"));
         Foo2 foo1 = new Foo2();   //创建对象的时候,递归调用了父类的构造函数
         oos.writeObject(foo1);
         oos.flush();
         oos.close();
         
         //反序列化是否递归调用父类的构造函数,不能证明
         ObjectInputStream ois = new ObjectInputStream(
                 new FileInputStream("demo/obj1.dat"));
         Foo2 foo2 = (Foo2)ois.readObject();
         System.out.println(foo2);
         ois.close();
         
         
         ObjectOutputStream oos1 = new ObjectOutputStream(
                 new FileOutputStream("demo/obj1.dat"));
         Bar2 bar1 = new Bar2();
         oos1.writeObject(bar1);
         oos1.flush();
         oos1.close();
         
         ObjectInputStream ois1 = new ObjectInputStream(
                 new FileInputStream("demo/obj1.dat"));
         Bar2 bar2 = (Bar2)ois1.readObject();
         System.out.println(bar2);
         ois1.close();
         
         
         /*
          * 对子类对象进行反序列化操作时,
          * 如果其父类没有实现序列化接口
          * 那么其父类的构造函数会被调用
          */
    }
}
/*
 *   一个类实现了序列化接口,那么其子类都可以进行序列化
 */
class Foo implements Serializable{ 
    public Foo(){
         System.out.println("foo...");
    }
}
class Foo1 extends Foo{
    public Foo1(){
         System.out.println("foo1...");
    }
}
class Foo2 extends Foo1{
    public Foo2(){
         System.out.println("foo2...");
    }
}
class Bar{
    public Bar(){
         System.out.println("bar");
    }
}
class Bar1 extends Bar{
    public Bar1(){
         System.out.println("bar1..");
    }
}
class Bar2 extends Bar1 implements Serializable{
    public Bar2(){
         System.out.println("bar2...");
    }
}
 
三 运行结果
foo...
foo1...
foo2...
com.imooc.io.Foo2@913fe2
bar
bar1..
bar2...
bar
bar1..

 

com.imooc.io.Bar2@eb7859
1
0
分享到:
评论

相关推荐

    java序列化全解

    需要注意的是,如果父类没有实现`Serializable`接口,但在反序列化时父类有默认构造函数,那么在反序列化过程中,父类的默认构造函数会被调用。但如果父类是可序列化的,那么Java反序列化时会直接从字节流中恢复对象...

    C++实现 类string的 普通构造函数, 拷贝构造函数 析构函数 和赋值函数

    对于`std::string`类,拷贝构造函数将确保源对象的所有数据都被深拷贝到新对象中,防止浅拷贝导致的数据共享问题。例如: ```cpp class MyString { public: MyString(const MyString& other) : data_(other.data_)...

    将treeView序列化Xml

    在C#编程中,将`TreeView`控件的数据序列化到XML文件是一个常见的需求,这样可以方便地保存用户的配置或状态,以便于下次应用启动时恢复。以下是如何实现这个功能的详细步骤和知识点: 首先,我们需要创建两个...

    C++ JSON 序列化与反序列化

    本篇文章将深入探讨C++中JSON的序列化与反序列化。 **一、JSON序列化** 序列化是指将C++的对象转换为JSON字符串的过程,以便在网络上传输或保存到文件中。常见的C++ JSON序列化库有RapidJSON、nlohmann/json、...

    C#序列化反序列化实例

    在IT行业中,序列化和反序列化是两个关键的概念,特别是在使用编程语言如C#时。它们主要用于将对象的状态转化为可存储或传输的数据格式,以及将这种数据还原为原来的对象状态。下面我们将深入探讨C#中的序列化和反...

    什么是java序列化,如何实现java序列化?学习.pdf

    如果父类没有实现串行化接口,则其必须有默认的构造函数(即没有参数的构造函数)。否则编译的时候就会报错。 Java 序列化机制的优点: 1. 允许将对象通过网络进行传播,并可以随时把对象持久化到数据库、文件等...

    delphi序列化与反序列化

    在IT行业中,序列化和反序列化是两个关键的概念,特别...开发者应选择合适的序列化库,或者自行实现序列化机制,以满足项目需求,并注意处理兼容性问题。通过熟练掌握这些技巧,可以提高Delphi应用的稳定性和用户体验。

    父类赋值给子类

    子类的构造函数可以接受一个父类对象作为参数,然后在构造函数内部,使用成员变量直接赋值或者通过 `base` 关键字调用父类的构造函数。例如: ```csharp public class Parent { public int Id { get; set; } ...

    php构造函数实例讲解

    - 如果需要在子类中重写构造函数,记得调用父类的构造函数以确保正确初始化。 通过以上讲解和实例,你应该对PHP构造函数有了更深入的理解。在实际编程中,合理地运用构造函数可以提高代码的清晰度和可维护性。

    TreeView的序列化

    ### TreeView 的序列化 在本篇文章中,我们将探讨如何对 `TreeView` 控件进行序列化,以便在程序运行期间保存其状态,并能在后续需要时恢复。本文将详细介绍使用 `.NET` 中 `System.Runtime.Serialization....

    一个对象发序列化的工具函数

    这里的“一个对象发序列化的工具函数”是指一个JavaScript开发中的实用工具,它能够将JavaScript对象转换为可传输或存储的格式,例如JSON字符串,然后在需要时将其还原回原来的对象形式。这种功能对于网络应用、数据...

    winform 自定义序列化源码

    这个构造函数在反序列化时会被调用,用于重建对象。 3. **序列化和反序列化逻辑**:在GetObjectData方法中,遍历对象的所有属性,将需要保存的数据添加到SerializationInfo实例中。在构造函数中,从...

    基于boost的序列化与反序列化

    `serialize()` 函数用于实际的数据存取,而 `save_construct_data()` 用于保存构造对象所需的信息,以便在反序列化时重建对象。 例如,对于一个名为`MyClass`的类,你可以这样定义序列化: ```cpp class MyClass {...

    C#自定义序列化ISerializable的实现方法

    1. `protected TestObject(SerializationInfo info, StreamingContext context)`:这是ISerializable接口要求的构造函数,用于在反序列化时恢复对象状态。在这个构造函数中,我们从`SerializationInfo`对象中获取并...

    用Javascript将form所有内容序列化和反序列化的例子。

    一个简单的序列化函数可以遍历表单的所有元素,收集它们的`name`属性和`value`属性,然后将这些数据组合成一个URL编码的字符串。例如: ```javascript function serializeForm(form) { var formData = new ...

    对象的序列化和反序列化

    然而,反序列化时需要注意安全问题,因为它可能会执行对象构造函数和字段初始化代码,因此如果数据来源不可信,可能会引入安全风险,例如通过恶意构造的序列化数据进行攻击。 序列化还涉及到版本控制问题。当类的...

    javascript实现序列化serializable unserializable

    如果你需要保留函数,可以考虑将函数转换为字符串存储,然后在反序列化时重新构造函数。 在实际应用中,我们可能还会遇到跨域通信(CORS)和同源策略的问题。在这种情况下,JSONP和CORS等技术可以用来解决这些问题...

    反序列化作用

    父类实现序列化后,其子类也会自动实现序列化,无需再显式实现Serializable接口。 在序列化过程中,如果对象的实例变量引用了其他对象,那么这些被引用的对象也会被递归序列化。但是,并非所有的对象都可以被序列化...

    C/C++结构体序列化配置模板化

    模板可以在这里派上用场,因为它允许我们为不同的数据类型编写一个通用的序列化函数。 以下是一个基本的模板序列化函数的例子: ```cpp template std::string serialize(const T& obj) { std::ostringstream oss;...

    shiro反序列化复现.zip

    反序列化漏洞通常发生在程序接收来自不可信源的序列化对象时,如果这个对象包含了恶意构造的代码,且在反序列化过程中被执行,就可能造成安全问题,如远程代码执行(RCE)或者权限提升等。Apache Shiro在过去的版本...

Global site tag (gtag.js) - Google Analytics