`
cakin24
  • 浏览: 1396309 次
  • 性别: 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#中的序列化和反...

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

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

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

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

    delphi序列化与反序列化

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

    父类赋值给子类

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

    php构造函数实例讲解

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

    dotnet C# 只创建对象不调用构造函数方法.rar

    在某些特殊场合,如序列化、反射或元数据处理,我们可能需要避免调用构造函数。通过了解并熟练运用这些技术,开发者可以更好地适应各种复杂的需求,提高代码的灵活性和可维护性。不过,需要注意的是,不调用构造函数...

    TreeView的序列化

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

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

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

    C++CArchive序列化存储

    在C++编程中,CArchive类是MFC(Microsoft Foundation Classes)库中的一个重要组件,它提供了对象的序列化和反序列化功能。序列化是指将内存中的数据结构或对象转换为可以存储或传输的格式,而反序列化则是将这种...

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

Global site tag (gtag.js) - Google Analytics