首页 > 其他分享 >Externalizable接口实现序列化与反序列化

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

时间:2023-12-20 22:55:31浏览次数:34  
标签:String Externalizable lastName 接口 sex firstName 序列化 public

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();
    }
}

 

标签:String,Externalizable,lastName,接口,sex,firstName,序列化,public
From: https://www.cnblogs.com/oktokeep/p/17917826.html

相关文章

  • Java序列化和反序列化 Serializable BeanUtils.copyProperties赋值属性方法
    Java序列化和反序列化SerializableBeanUtils.copyProperties赋值属性方法packagecom.example.core.mydemo.java;importcom.example.core.mydemo.json2.GsonUtils;importorg.springframework.beans.BeanUtils;importjava.io.*;/***Java序列化和反序列化Serializ......
  • 【代码块】-结构体序列化与反序列化
    整理代码块代码块整理后存储,供后期使用结构体序列化与反序列化usingSystem;usingSystem.Runtime.InteropServices;usingSystem.Text;namespacestructTest{///<summary>///结构体序列化///</summary>publicclassstructSerializable{......
  • c# - 如何在自定义 System.Text.Json JsonConverter 中使用默认序列化?
    我正在写一个 custom System.Text.Json.JsonConverter 将旧数据模型升级到新版本。我已覆盖 Read()并实现了必要的后处理。但是,我根本不需要在 Write() 中做任何自定义操作。方法。如果我根本没有转换器,如何自动生成默认序列化?显然我可以使用不同的 JsonSerializerOption......
  • 从零开始用 Axios 请求后端接口
    对于前端同学来说,请求后端接口是一个非常通用的东西。在十几年前的时候,我们还用Ajax去请求后端接口。但在2023年的今天,很多框架都很成熟了,我们有了更加快捷的方式——Axios框架。请求框架哪家强?对于使用Vue技术栈的同学来说,其实接口请求框架就三种:vue-resource、Axios......
  • EasyCVR平台如何通过api接口设置实时流的sei数据实现画框等操作?
    为了便于用户自由调用、集成与二次开发,EasyCVR平台也提供了丰富的API接口供大家使用。今天我们来分享一下如何通过API接口设置实时流的SEI数据,实现在视频播放器中展示文本内容、画框等操作?1)后端接口调用如下:接口URL:POSThttp://127.0.0.1:18000/api/v1/sei/set2)接口参数如下:3)调用成......
  • Apipost:一键生成接口文档
    你是否经常遇到接口开发过程中的各种问题?或许你曾为接口测试与调试的繁琐流程而烦恼。不要担心!今天我将向大家介绍一款功能强大、易于上手的接口测试工具——Apipost,并带你深入了解如何玩转它,轻松实现接口测试与调试。什么是Apipost?Apipost是一款API全生命周期管理平台,它提供了一系......
  • Apipost:一键生成接口文档
    你是否经常遇到接口开发过程中的各种问题?或许你曾为接口测试与调试的繁琐流程而烦恼。不要担心!今天我将向大家介绍一款功能强大、易于上手的接口测试工具——Apipost,并带你深入了解如何玩转它,轻松实现接口测试与调试。什么是Apipost?Apipost是一款API全生命周期管理平台,它提供了......
  • 安防监控EasyCVR平台如何通过api接口设置实时流的sei数据实现画框等操作?
    国标GB28181视频监控系统EasyCVR平台采用了开放式的网络结构,支持高清视频的接入和传输、分发,能提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力,此外,高清可视化视频监控平台EasyCVR还具......
  • 接口自动化之excel读写封装
    本次封装基于openpyxl进行的二次封装安装openpyxlpipinstallopenpyxl封装ExcelReader采用yield的方式返回数据,减少内存的占用classExcelReader:def__init__(self,filename):self._excel:Workbook=load_workbook(filename,read_only=True)d......
  • 接口自动化之响应数据封装
    在使用requests实现接口自动化时,接口响应的数据没有代码提示,要获取某个接口字段就需要通过[xxx]的方式来获取,实际开发过程中希望能通过.的方式来获取到某个接口响应属性。方式一、使用dataclassdataclass是python3.7新推出的特性之一fromdataclassesimportdataclass@......