一 介绍
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
相关推荐
需要注意的是,如果父类没有实现`Serializable`接口,但在反序列化时父类有默认构造函数,那么在反序列化过程中,父类的默认构造函数会被调用。但如果父类是可序列化的,那么Java反序列化时会直接从字节流中恢复对象...
对于`std::string`类,拷贝构造函数将确保源对象的所有数据都被深拷贝到新对象中,防止浅拷贝导致的数据共享问题。例如: ```cpp class MyString { public: MyString(const MyString& other) : data_(other.data_)...
在C#编程中,将`TreeView`控件的数据序列化到XML文件是一个常见的需求,这样可以方便地保存用户的配置或状态,以便于下次应用启动时恢复。以下是如何实现这个功能的详细步骤和知识点: 首先,我们需要创建两个...
本篇文章将深入探讨C++中JSON的序列化与反序列化。 **一、JSON序列化** 序列化是指将C++的对象转换为JSON字符串的过程,以便在网络上传输或保存到文件中。常见的C++ JSON序列化库有RapidJSON、nlohmann/json、...
在IT行业中,序列化和反序列化是两个关键的概念,特别是在使用编程语言如C#时。它们主要用于将对象的状态转化为可存储或传输的数据格式,以及将这种数据还原为原来的对象状态。下面我们将深入探讨C#中的序列化和反...
如果父类没有实现串行化接口,则其必须有默认的构造函数(即没有参数的构造函数)。否则编译的时候就会报错。 Java 序列化机制的优点: 1. 允许将对象通过网络进行传播,并可以随时把对象持久化到数据库、文件等...
在IT行业中,序列化和反序列化是两个关键的概念,特别...开发者应选择合适的序列化库,或者自行实现序列化机制,以满足项目需求,并注意处理兼容性问题。通过熟练掌握这些技巧,可以提高Delphi应用的稳定性和用户体验。
子类的构造函数可以接受一个父类对象作为参数,然后在构造函数内部,使用成员变量直接赋值或者通过 `base` 关键字调用父类的构造函数。例如: ```csharp public class Parent { public int Id { get; set; } ...
- 如果需要在子类中重写构造函数,记得调用父类的构造函数以确保正确初始化。 通过以上讲解和实例,你应该对PHP构造函数有了更深入的理解。在实际编程中,合理地运用构造函数可以提高代码的清晰度和可维护性。
### TreeView 的序列化 在本篇文章中,我们将探讨如何对 `TreeView` 控件进行序列化,以便在程序运行期间保存其状态,并能在后续需要时恢复。本文将详细介绍使用 `.NET` 中 `System.Runtime.Serialization....
这里的“一个对象发序列化的工具函数”是指一个JavaScript开发中的实用工具,它能够将JavaScript对象转换为可传输或存储的格式,例如JSON字符串,然后在需要时将其还原回原来的对象形式。这种功能对于网络应用、数据...
这个构造函数在反序列化时会被调用,用于重建对象。 3. **序列化和反序列化逻辑**:在GetObjectData方法中,遍历对象的所有属性,将需要保存的数据添加到SerializationInfo实例中。在构造函数中,从...
`serialize()` 函数用于实际的数据存取,而 `save_construct_data()` 用于保存构造对象所需的信息,以便在反序列化时重建对象。 例如,对于一个名为`MyClass`的类,你可以这样定义序列化: ```cpp class MyClass {...
1. `protected TestObject(SerializationInfo info, StreamingContext context)`:这是ISerializable接口要求的构造函数,用于在反序列化时恢复对象状态。在这个构造函数中,我们从`SerializationInfo`对象中获取并...
一个简单的序列化函数可以遍历表单的所有元素,收集它们的`name`属性和`value`属性,然后将这些数据组合成一个URL编码的字符串。例如: ```javascript function serializeForm(form) { var formData = new ...
然而,反序列化时需要注意安全问题,因为它可能会执行对象构造函数和字段初始化代码,因此如果数据来源不可信,可能会引入安全风险,例如通过恶意构造的序列化数据进行攻击。 序列化还涉及到版本控制问题。当类的...
如果你需要保留函数,可以考虑将函数转换为字符串存储,然后在反序列化时重新构造函数。 在实际应用中,我们可能还会遇到跨域通信(CORS)和同源策略的问题。在这种情况下,JSONP和CORS等技术可以用来解决这些问题...
父类实现序列化后,其子类也会自动实现序列化,无需再显式实现Serializable接口。 在序列化过程中,如果对象的实例变量引用了其他对象,那么这些被引用的对象也会被递归序列化。但是,并非所有的对象都可以被序列化...
模板可以在这里派上用场,因为它允许我们为不同的数据类型编写一个通用的序列化函数。 以下是一个基本的模板序列化函数的例子: ```cpp template std::string serialize(const T& obj) { std::ostringstream oss;...
反序列化漏洞通常发生在程序接收来自不可信源的序列化对象时,如果这个对象包含了恶意构造的代码,且在反序列化过程中被执行,就可能造成安全问题,如远程代码执行(RCE)或者权限提升等。Apache Shiro在过去的版本...