热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

大数据编程入门:Java序列化

在Java中提供了一种对象序列化机制,今天小编将为大家带来大数据编程入门:Java序列化

在Java中提供了一种对象序列化机制,今天小编将为大家带来大数据编程入门:Java序列化这篇文章来介绍序列化及反序列化。

一、序列化概念

Java提供了一种对象序列化的机制,在这种机制中,对象可以表示为字节序列,其中包括对象的数据、关于对象类型的信息以及存储在对象中的数据类型。

将序列化对象写入文件后,可以从文件中读取并反序列化该对象,也就是说,可以使用对象中的对象类型信息、对象数据和数据类型在内存中创建新对象。

整个过程是独立于Java虚拟机(JVM)的,也就是说,在一个平台上序列化的对象可以在完全不同的平台上反序列化。

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

ObjectOutputStream类包含许多写入方法来写入各种数据类型,但有一个特殊的例外:

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 程序实例了反序列化,/tmp/employee.ser 存储了 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);

    }

}

运行结果:

这里需要注意以下要点:

readObject()方法中的try/catch代码块尝试捕获ClassnotFoundException异常。对于要反序列化对象的JVM,它必须是能够找到字节码的类。如果JVM在对象反序列化期间找不到该类,则会引发ClassnotFoundException异常。

注意,readObject()方法的返回值被转化成Employee引用。

当对象被序列化时,属性SSN的值为111222333,但是因为该属性是短暂的,该值没有被发送到输出流,所以反序列化后 Employee 对象的SSN属性为 0。

以上就是关于大数据编程入门:Java序列化的全部内容了,希望这篇文章可以帮助到大家~

热文荐读:

大数据开发:SpringMVC框架入门

大数据开发:Git工作原理解析

大数据分析:SOA面向服务架构解读

大数据开发:看了都说好的JVM分析



推荐阅读
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 本文详细介绍了Java中的注解功能,包括如何定义注解类型、设置注解的应用范围及生命周期,并通过具体示例展示了如何利用反射机制访问注解信息。 ... [详细]
  • 前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • andr ... [详细]
  • 图数据库中的知识表示与推理机制
    本文探讨了图数据库及其技术生态系统在知识表示和推理问题上的应用。通过理解图数据结构,尤其是属性图的特性,可以为复杂的数据关系提供高效且优雅的解决方案。我们将详细介绍属性图的基本概念、对象建模、概念建模以及自动推理的过程,并结合实际代码示例进行说明。 ... [详细]
  • 深入理解Java字符串池机制
    本文详细解析了Java中的字符串池(String Pool)机制,探讨其工作原理、实现方式及其对性能的影响。通过具体的代码示例和分析,帮助读者更好地理解和应用这一重要特性。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
author-avatar
奇力0_843
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有