Externalizable接口实现序列化与反序列化

package com.example.core.mydemo.java;

import com.example.core.mydemo.json2.GsonUtils;

import java.io.*;

/**
* Externalizable接口实现序列化与反序列化
*
* Serialization(序列化):将java对象以一连串的字节保存在磁盘文件中的过程,也可以说是保存java对象状态的过程。序列化可以将数据永久保存在磁盘上(通常保存在文件中)。
* deserialization(反序列化):将保存在磁盘文件中的java字节码重新转换成java对象称为反序列化。
*
* Externalizable接口继承Serializable接口,实现Externalizable接口需要实现readExternal()方法和writeExternal()方法,这两个方法是抽象方法,对应的是serializable接口的readObject()方法和writeObject()方法,可以理解为把serializable的两个方法抽象出来
*
* output
* writeExternal>>>
* Person object has been serialized.
* readExternal>>>
* Deserialized Person's name is :{"firstName":"John","lastName":"Doe","sex":"男"}
*
*/
public class ExternalizableExample { public static void main(String[] args) throws IOException, ClassNotFoundException{
// 创建要被序列化的对象
Person2 person = new Person2("John", "Doe");
person.setSex("男");
// 创建输出流
FileOutputStream fileOut = new FileOutputStream("person2.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut); // 将对象写入输出流
out.writeObject(person); // 关闭输出流
out.close();
fileOut.close(); System.out.println("Person object has been serialized."); // 从输入流中读取并反序列化对象
FileInputStream fileIn = new FileInputStream("person2.ser");
ObjectInputStream in = new ObjectInputStream(fileIn); // 从输入流中读取对象
Person2 deserializedPerson = (Person2)in.readObject(); // 打印反序列化后的对象信息
System.out.println("Deserialized Person's name is :" + GsonUtils.toJson(deserializedPerson)); // 关闭输入流
in.close();
fileIn.close(); }
} package com.example.core.mydemo.java; import java.io.*; public class Person2 implements Externalizable {
private String firstName;
private String lastName;
//transient关键字表示有理的,被修饰的数据不能进行序列化
// private transient String sex;
//static关键字表示静态的,被修饰的数据不能进行序列化
// private static String sex;
private String sex; public Person2(){
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public Person2(String fname, String lname){
this.firstName = fname;
this.lastName = lname;
} public void setFirstName(String firstName) {
this.firstName = firstName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} public String getFirstName(){
return firstName;
} public String getLastName(){
return lastName;
} public String getName(){
return firstName + " " + lastName;
} @Override
public void writeExternal(ObjectOutput out) throws IOException {
System.out.println("writeExternal>>>");
out.writeObject(firstName);
out.writeObject(lastName);
out.writeObject(sex);
} @Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
System.out.println("readExternal>>>");
//读写 一一对应,如果按下列顺序来,结果输出如下:Deserialized Person's name is :{"firstName":"男","lastName":"Doe","sex":"John"}
// sex = (String) in.readObject();
// lastName = (String) in.readObject();
// firstName = (String) in.readObject(); //输出和写入需要保持一致
firstName = (String) in.readObject();
lastName = (String) in.readObject();
sex = (String) in.readObject();
}
}

Externalizable接口实现序列化与反序列化的更多相关文章

  1. C#实现接口xml序列化与反序列化

    C#实现接口xml序列化与反序列化   C#中接口无法被xml序列化,提示不支持.百度和bing也搜不到,只好自己动手写了 原理上肯定支持,.Net自己的xml序列化有一个IXmlSerializab ...

  2. Java基础(十一)--Serializable和Externalizable接口实现序列化

    序列化在日常开发中经常用到,特别是涉及到网络传输的时候,例如调用第三方接口,通过一个约定好的实体进行传输,这时你必须实现序列 化,这些都是大家都了解的内容,所以文章也会讲一下序列化的高级内容. 序列化 ...

  3. python接口测试之序列化与反序列化(四)

    在python中,序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式 字符串解码为python数据对象.在python的标准库中,专门提供了jso ...

  4. K:java序列化与反序列化—transient关键字的使用

      首先,应该明白的是transient是java中的一个关键字,音标为 英: [ˈtrænziənt].   在了解transient关键字之前,应该先弄明白序列化和反序列化.所谓的序列化,通俗点的 ...

  5. [转]Serializable接口与Externalizable接口区别

    被Serializable接口声明的类的对象的内容都将被序列化,如果现在用户希望自己指定序列化的内容,则可以让一个类实现Externalizable接口,此接口定义如下: public interfa ...

  6. Java 自定义序列化、反序列化

    1.如果某个成员变量是敏感信息,不希望序列化到文件/网络节点中,比如说银行密码,或者该成员变量所属的类是不可序列化的, 可以用 transient 关键字修饰此成员变量,序列化时会忽略此成员变量. c ...

  7. 面试题:Java序列化与反序列化

    目录 序列化和反序列化的概念 应用场景? 序列化实现的方式 继承Serializable接口,普通序列化 继承Externalizable接口,强制自定义序列化 serialVersionUID的作用 ...

  8. Externalizable接口 序列化

    Java默认的序列化机制非常简单,而且序列化后的对象不需要再次调用构造器重新生成,但是在实际中,我们可以会希望对象的某一部分不需要被序列化,或者说一个对象被还原之后, 其内部的某些子对象需要重新创建, ...

  9. Java中实现序列化的两种方式 Serializable 接口和 Externalizable接口

    对象的序列化就是将对象写入输出流中. 反序列化就是从输入流中将对象读取出来. 用来实现序列化的类都在java.io包中,我们常用的类或接口有: ObjectOutputStream:提供序列化对象并把 ...

  10. Java序列化与反序列化学习(二):序列化接口说明

    一.序列化类实现Serializable接口 Serializable接口没有方法,更像是个标记.有了这个标记的Class就能被序列化机制处理. ObjectOutputStream只能对Serial ...

随机推荐

  1. 阿里云日志服务SLS,打造云原生时代智能运维

    ​2021年10月21日,阿里云针对企业运维难题,在云栖大会为大家带来了一场<智能运维论坛>的主题演讲.在会上,阿里云资深技术专家.日志服务技术负责人简志提出"云原生时代,企业业 ...

  2. [FAQ] Goland 始终没有包代码的提示 ?

    表现:import 引入的包始终是红色的,表示没有找到引入的包. 注意,在这里开启Go Modules: 然后在 Exteneral Libraries 里看到 Go Modules 即可. Refe ...

  3. [Go] 有了 cast 组件, golang 类型转换从此不再困扰

    在 golang 中,参数和返回值之间往往涉及 int.string.[].map 等之间的转换. 如果是手动去处理,一容易出错,二不能兼容多数类型,比较麻烦. 使用 cast,能够让代码更健壮.可维 ...

  4. 从 Uno Platform 4 更新 Uno Platform 5 的迁移方法

    本文记录我的一个小项目从 Uno Platform 4 更新 Uno Platform 5 的一些变更和迁移方法,由于项目太小,可能踩到的坑不多 官方文档: Migrating to Uno Plat ...

  5. ASP.NET Core 浅析环境变量与配置的优先级

    本文将简单介绍在 dotnet 6 下的 ASP.NET Core 里的环境变量当成配置的优先级行为.这部分内容在官方文档都有提到,只是我开始粗心没有看仔细,而踩到了坑,特意写篇博客记录一下 在 AS ...

  6. 我的 Kafka 旅程 - 概念 · 特点 · 组成 · 模式 · 应用

    系列目录 我的 Kafka 旅程 - 概念 · 特点 · 组成 · 模式 · 应用 我的 Kafka 旅程 - Linux下的安装 · 基础命令 · 集群 我的 Kafka 旅程 - Producer ...

  7. iptables命令详解

    安装iptables yum install iptables-services 编写允许访问的策略 vim /etc/sysconfig/iptables # sample configuratio ...

  8. 在Linux下想要删除一个目录需要怎样的权限

    场景一 在Home目录下创建一个目录dirtest,然后使用chmod 333 dirtest修改目录权限.这时候dirtest的权限为d-wx-wx-wx,如果执行rm -r dirtest可以进行 ...

  9. ip地址、子网掩码、网关、dns简介

    IP地址IPADDR: IP地址是唯一的标识,是一段网络编码(二进制),由32位组成. IP 是 Internet Protocol(网际互连协议)的缩写,是 TCP/IP 体系中的网络层协议. IP ...

  10. 使用js有效括号匹配封装函数

    点击查看代码 function isValidParentheses(str) { // 定义一个栈,用于存储待匹配的左括号 let stack = []; // 定义一个对象,用于快速判断括号是否成 ...