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. [ML] 工程师使用 Keras 的步骤指引

    设置 import numpy as np import tensorflow as tf from tensorflow import keras 介绍 在训练模型之前准备数据(将其转换为 NumP ...

  2. [Go] CORS 支持多个 origin 访问的思路 (Access-Control-Allow-Origin 部分)

    以下为局部伪代码,仅供参考: var allowOrigin string allowOrigins := config.AppConf.Get("middleware.cors.allow ...

  3. [php-src] Php扩展开发的琐碎注意点、细节

    内容均以php-5.6.14为例. 函数中接收的字符串参数长度不包含结尾的0,在 zend_update_property 中,长度的参数是 int len,一般都使用 ZEND_STRL(NAME) ...

  4. [FAQ] "cannot refer to unexported name" in Golang ?

    Golang 项目中如果使用了其它模块中找不到的函数.常量等,都会提示 "cannot refer to unexported name". 遇到这种情况,要么是拼写错误了,要么是 ...

  5. STM32 ADC使用问题

    基本信息 MCU:STM32F105R8T6 库:HAL 平台:MDK 精度:12位 问题一 现象: 在测量的时候,发现采样值在 1023 ~ 1042 和 1279 ~ 1290 两个区间之间无法测 ...

  6. SpringBoot注入时设置《多例》

    SpringBoot设置多例 1.准备数据 测试接口 package com.cc.jschdemo.springmultiton; /** * <p>spring多例测试</p&g ...

  7. SAP UI5 官方教程学习记录

    最近有闲跟着官方的Get Started教程学习了UI5,记录一下自己学习中遇到的几个问题. 本文链接:https://www.cnblogs.com/hhelibeb/p/17835722.html ...

  8. 使用openvp*-gui客户端连接多服务端,作为Windows服务部署

    背景 多数公司都会用到VPN隧道技术链接服务器,保证服务器的安全,但多数情况下会存在多服务端的情况,这时就有客户端连接多个服务端的必要了,如果每次都要切换配置的话,对于有强迫症的兄弟当然忍不了了 思考 ...

  9. gin-vue-admin开发教程 02 了解项目目录结构和代码执行的流程

    学习目标: 介绍项目 项目目录(2.0) 后台的启动过程 前台的启动过程 前后台交互的流程 视频学习地址: https://www.bilibili.com/video/BV1Rz4y1X7Zr (海 ...

  10. Linux下的目录

    FHS 因为利用Linux来开发产品或distributions的社群/公司与个人实在太多了, 如果每个人都用自己的想法来配置文件放置的目录,那么将可能造成很多管理上的困扰. 你能想象,你进入一个企业 ...