Java Serialization/序列化/反序列化

Kylin系统离线环境下的dpkg依赖包高效部署指南 本文详细介绍了在Kylin系统离线环境下高效部署dpkg依赖包的完整方案,包括预下载依赖包、构建本地APT仓库以及高级故障排查技巧。通过实战经验和优化建议,帮助用户解决依赖地狱问题,提升部署效率,特别适用于银河麒麟V10等内网环境。 阅读详情

Java提供了一个机制,称为一个对象可以被表示为字节序列,包括该对象的数据以及关于该对象的类型,并存储在对象数据的类型的信息的对象序列。

后一个序列化的对象已经被写入到一个文件中,也可以从文件中读取和反序列化也就是,表示对象和它的数据可以用于重新创建在存储器中的对象的类型信息和字节。

最令人印象深刻的是,整个过程是独立的JVM,这意味着一个对象可以被序列化在一个平台上,并反序列化一个完全不同的平台上。

ObjectInputStream 和 ObjectOutputStream 是包含了方法,序列化和反序列化对象的高层次的数据流。

ObjectOutputStream类包含许多write方法写入各种数据类型,但在特定的一个方法脱颖而出:

public final void writeObject(Object x) throws IOException

上述方法序列化一个对象,并将其发送到输出流。同样,ObjectInputStream的类包含用于反序列化对象的以下方法:

public final Object readObject() throws IOException, 
                                 ClassNotFoundException

此方法检索的下一个对象输出流和反序列化。返回值是Object,所以需要将它转换成其相应的数据类型。

为了演示序列化的运作方式在Java中,将使用在本教程中在前面讨论的Employee类。假设我们有以下的Employee类,它实现了Serializable接口:

public class Employee implements java.io.Serializable
{
   public String name;
   public String address;
   public transient int SSN;
   public int number;
   public void mailCheck()
   {
      System.out.println("Mailing a check to " + name
                           + " " + address);
   }
}

请注意,一类被序列化成功,两个条件必须满足:

  • 这个类必须实现java.io.Serializable接口。

  • 所有在类中的字段必须是可序列化的。如果一个字段不是可序列化的,必须注明短暂的。

如果想知道,一个Java标准类是可序列化与否,请检查类的文档。测试很简单:如果一个类实现了java.io.Serializable,那么它是可序列化的,否则,它不是。

序列化一个对象:

ObjectOutputStream类用于序列化一个对象。下面SerializeDemo程序实例化一个Employee对象,并将其序列化到一个文件中。

当程序执行完毕,一个名为employee.ser被创建。程序不会产生任何输出,但研究代码,并尝试确定哪些程序正在做什么。

注:当序列化一个对象到一个文件中,在Java标准惯例给定的文件扩展名为 .ser 。

import java.io.*;

public class SerializeDemo
{
   public static void main(String [] args)
   {
      Employee e = new Employee();
      e.name = "Reyan Ali";
      e.address = "Phokka Kuan, Ambehta Peer";
      e.SSN = 11122333;
      e.number = 101;
      try
      {
         FileOutputStream fileOut =
         new FileOutputStream("/tmp/employee.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(e);
         out.close();
         fileOut.close();
         System.out.printf("Serialized data is saved in /tmp/employee.ser");
      }catch(IOException i)
      {
          i.printStackTrace();
      }
   }
}

反序列化对象:

下面DeserializeDemo程序反序列化的SerializeDemo程序创建的Employee对象。研究程序,并尝试确定其输出:

import java.io.*;
public class DeserializeDemo
{
   public static void main(String [] args)
   {
      Employee e = null;
      try
      {
         FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
         ObjectInputStream in = new ObjectInputStream(fileIn);
         e = (Employee) in.readObject();
         in.close();
         fileIn.close();
      }catch(IOException i)
      {
         i.printStackTrace();
         return;
      }catch(ClassNotFoundException c)
      {
         System.out.println("Employee class not found");
         c.printStackTrace();
         return;
      }
      System.out.println("Deserialized Employee...");
      System.out.println("Name: " + e.name);
      System.out.println("Address: " + e.address);
      System.out.println("SSN: " + e.SSN);
      System.out.println("Number: " + e.number);
    }
}

这将产生以下结果:

Deserialized Employee...
Name: Reyan Ali
Address:Phokka Kuan, Ambehta Peer
SSN: 0
Number:101

这里有以下重要点要注意:

  • try/catch块试图捕获一个ClassNotFoundException,这是由readObject()方法声明。对于一个JVM能够反序列化对象时,它必须能够找到的字节码的类。如果JVM不能对象的反序列化过程中发现的一类,它抛出一个ClassNotFoundException。

  • 请注意,调用readObject()返回值被强制转换为Employee 参考。 

  • SSN字段的值是11122333当对象被序列化,但因为该字段是短暂的,这个值是不会被发送到输出流。反序列化的Employee对象的SSN字段为0。

WPF窗口定位技巧:从基础到高级的三种实现方法 本文详细解析WPF窗口定位的三种核心方法:屏幕居中(CenterScreen)、父窗口居中(CenterOwner)和手动定位(Manual)。通过对比其适用场景、实现代码与注意事项,帮助开发者根据实际需求选择最佳方案,从而提升WPF应用程序的用户体验与专业度。 阅读详情

相关推荐

CVE-2023-21839:Weblogic反序列化漏洞复现

WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。

薛定谔嘚喵博客 5659

Java序列化(Serialization) 机制

本篇文章是对Java中对象的序列化(Serialization) 机制进行了详细的分析介绍,并附实例,需要的朋友可以参考下

VDA 6.3_EN_2022 黄皮书.最新版 汽车质量VDA6.3-2022过程审核

VDA 6.3_EN_2022 黄皮书.最新版 汽车质量VDA6.3-2022过程审核

JNDI注入高版本绕过学习

JNDI(Java Naming and Directory Interface)是一个应用程序设计的 API,一种标准的 Java 命名系统接口。JNDI 提供统一的客户端 API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将 JNDI API 映射为特定的命名服务和目录系统,使得 Java 应用程序可以和这些命名服务和目录服务之间进行交互。

why811的博客 613

Java ldap协议分析

LDAP是Lightweight Directory Access Protocol的缩写,顾名思义,它是指轻量级目录访问协议。这个协议是用于访问目录服务的。目录服务和数据库很类似,但又有着很大的不同之处。数据库设计为方便读写,但目录服务专门进行了读优化的设计,因此不太适合于经常有写操作的数据存储。目录服务会通过树状结构存储数据,如下图,这样存储的优点就是查询效率高。

YakProject的博客 374

Java Serialization/序列化/反序列化 及 transient Java关键字详解

以前只知道序列化反序列化的意思及怎么去使用,没有更深入的去了解,在学习之中遇到了这个transient关键字,以前并不知道在Java中 还有 transient 关键字,既然遇到了就花点时间把整理一下,查阅了一些资料看了一下,自己整理一份让方便更多的人去学习。 首先,Java提供了一个机制,称为一个对象可以被表示为字节序列,包括该对象的数据以及关于该对象的类型,并存储在对象数据

_William_Cheung的博客 1929

MessagePack Java 0.6.X 多种类型变量的序列化反序列化serialization/deserialization

类Packer/Unpacker允许序列化反序列化多种类型的变量,如后续程序所示。这个类启用序列化反序列化多种类型的变量和序列化主要类型变量以及包装类,String对象,byte[]对象,ByteBuffer对象等的方法相似。 如上面提示的,你可以序列化反序列化你自己的对象,前提是你自己的对象需要使用@Message注解。 package com.insight.dem...

HONEY MOOSE 381

MessagePack Java 0.6.X 多种类型变量的序列化反序列化serialization/deserialization)...

类Packer/Unpacker允许序列化反序列化多种类型的变量,如后续程序所示。这个类启用序列化反序列化多种类型的变量和序列化主要类型变量以及包装类,String对象,byte[]对象,ByteBuffer对象等的方法相似。 如上面提示的,你可以序列化反序列化你自己的对象,前提是你自己的对象需要使用@Message注解。 package com.insight...

weixin_30621711的博客 132

如何用FST快速实现Java对象序列化?3分钟入门教程

FST(Fast Java Serialization)是一个高性能的Java对象序列化库,作为JDK默认序列化的替代品,它能显著提升序列化速度并减小数据体积。本文将带你快速掌握FST的核心用法,让你在3分钟内实现高效的Java对象序列化。 ## 🚀 FST的核心优势 FST相比JDK默认序列化具有以下显著优势: - **速度提升**:序列化/反序列化速度比JDK快5-10倍 - **体积更

gitblog_00451的博客 373

Java代码

序列化反序列化

2301_80484816的博客 227

5. Kafka 序列化器,生产者 Serializer,消费者 Deserializer

kafka入门到精通

weixin_39563769的博客 262

java异常NoClassDefFoundError

java异常NoClassDefFoundError

前路漫漫,少年,继续披荆斩棘! 590

JSON 概论 —— 现代互联网的“数字普通话”

JSON (JavaScript Object Notation) 是一种基于文本的、独立于语言的轻量级数据交换格式。

Lsk_Smion的博客 627

Hadoop的简单序列化框架

Hadoop提供了一个加单的序列化框架API,用于集成各种序列化实现。该框架由Serialization实现。 其中Serialization是一个接口,使用抽象工厂的设计模式,提供了一系列和序列化相关并相互依赖对象的额接口。通过Serialization应用可以获得类型的Serializer实例,即将一个对象转化为一个字节流的实现实例;Deserializer实例和Serializer实...

weixin_30892763的博客 123

Java对象的序列化Serialization)和反序列化详解

1.序列化反序列化 序列化Serialization)是将对象的状态信息转化为可以存储或者传输的形式的过程,一般将一个对象存储到一个储存媒介,例如档案或记忆体缓冲等,在网络传输过程中,可以是字节或者XML等格式;而字节或者XML格式的可以还原成完全相等的对象,这个相反的过程又称为反序列化; 2.Java对象的序列化反序列化Java中,我们可以通过多种方式来创建对象,并且只要对象...

OceanSky的专栏 12万+

c++ 序列化反序列化

c++ 序列化反序列化什么是序列化?为什么要序列化?优点在哪里?C++对象序列化的四种方法Google Protocol Buffers(protobuf)Boost.SerializationMFC SerializationNet Framework简单总结举例说明 什么是序列化序列化指的是将一个内存对象转化成一串字节数据(存储在一个字节数组中),可用于保存到本地文件或网络传输。反序列...

qq_34462436的博客 7355

Java 序列化Serialization

Java 序列化是指将对象转换为字节流的过程,以便将其存储到文件、数据库或通过网络传输。反序列化则是将字节流重新转换为对象的过程。通过实现接口,类可以被标记为可序列化的,该接口是一个标记接口,不包含任何方法。通过重写和方法,可以自定义序列化过程。// 调用默认序列化// 自定义处理// 调用默认反序列化// 自定义处理确保类实现接口并定义。使用transient关键字排除敏感字段。谨慎处理版本兼容性和安全风险。在跨语言场景中,考虑使用 JSON/XML 等更灵活的格式。

SSSYUsssyu的博客 1804

C++ 序列化反序列化学习

定义 程序员在编写应用程序的时候往往需要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯。这些过程将会涉及到程序数据转化成能被存储并传输的格式,因此被称为“序列化”(Serialization),而它的逆过程则可被称为“反序列化” (Deserialization) 简单来说,序列化就是将对象实例的状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它根据流重构对象。这两个过程结合起来,可以轻松地存储和传输数据。例如,可以序列化一个对象,然后使用

CHYabc123456hh的博客 3471
上一篇: java数组
下一篇: Servlet 生命周期
技术搬砖工
博客等级 码龄16年 144粉丝 265原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值