java序列化和反序列化

简介: java序列化和反序列化

什么是java序列化和反序列化?


  序列化的原理是将一个对象转成字节流,使其能被写入到文件中,通过网络传输或者存储在数据库中。反序列化则与其相反。


简而言之,序列化就是将对象转成字节流,反序列化则是将字节流重新恢复成对象。


  一个类只有实现了java.io.Serializable接口才有资格进行序列化。


定义Person类:


该类中将nationality声明为transient,所以该参数不会参与序列化操作。


 package com.led.javabase;
 import java.io.Serializable;
  /**
   * person entity
   */
  public class Person implements Serializable{
      private String name;
     private int age;
     private String gender;
     private transient String nationality;//this field will not take part in serialization
     public String getName() {
         return name;
     }
     public void setName(String name) {
         this.name = name;
    }
     public int getAge() {
         return age;
     }
     public void setAge(int age) {      
     this.age = age;
     }
    public String getGender() {
         return gender;
     }
     public void setGender(String gender) {
        this.gender = gender;
     }
     public String getNationality() {
         return nationality;
     }
     public void setNationality(String nationality) {
         this.nationality = nationality;
     }
     public Person(String name, int age, String gender, String nationality) {
         this.name = name;
         this.age = age;
         this.gender = gender;
       this.nationality = nationality;
     }
 }

 

序列化实例:


下面的例子是将一个person实例序列化到Person.ser文件中,通过FileOutputStreamObjectOutputStream来进行操作的:


 package com.led.javabase;
  import java.io.*;
  /**
   * java serialization test
   * @author Alan
   */
  public class SerializationTest1 {
     public static void main(String[] args) {
         Person person = new Person("Jack",11,"male","US");
         try {
             FileOutputStream fos = new FileOutputStream("Person.ser");
             ObjectOutputStream oos = new ObjectOutputStream(fos);
             oos.writeObject(person);
             oos.close();
             fos.close();
             System.out.println("Serialization done!");
         } catch (FileNotFoundException e) {
             e.printStackTrace();
         } catch (IOException e2) {
             e2.printStackTrace();
         }
     }
 }

控制台输出:


 

反序列化实例:


下面的例子通过使用FileInputStreamObjectInputStream来进行反序列化,通过读取Person.ser文件,将字节流转成Person类的对象,


由于Person类的nationality参数声明为了transient,所以该参数不参与序列化化操作,导致反序列化该参数输出为null


 package com.led;
  import com.led.javabase.Person;
  import java.io.*;
  /**
  * @author Alan
  * @Description: De-serialization Object
  * @date 2018/4/22 12:36
  */
 public class DeSerializtion {
     public static void main(String[] args) {
         Person o = null;
         try {
            FileInputStream fos = new FileInputStream("Person.ser");
            ObjectInputStream ois = new ObjectInputStream(fos);
             o = (Person) ois.readObject();
             ois.close();
             fos.close();
         } catch (FileNotFoundException e) {
             e.printStackTrace();
             return;
         } catch (IOException e2){
             e2.printStackTrace();
             return;
         } catch (ClassNotFoundException e) {
             e.printStackTrace();
             return;
         }
         System.out.println("student's name: " + o.getName());
         System.out.println("student's age: " + o.getAge());
         System.out.println("student's gender: " + o.getGender());
        System.out.println("student's nationality: " + o.getNationality());
     }
 }

控制台输出:


 

相关文章
|
6天前
|
存储 XML JSON
用示例说明序列化和反序列化
用示例说明序列化和反序列化
|
14天前
|
JSON fastjson Java
niubility!即使JavaBean没有默认无参构造器,fastjson也可以反序列化。- - - - 阿里Fastjson反序列化源码分析
本文详细分析了 Fastjson 反序列化对象的源码(版本 fastjson-1.2.60),揭示了即使 JavaBean 沲有默认无参构造器,Fastjson 仍能正常反序列化的技术内幕。文章通过案例展示了 Fastjson 在不同构造器情况下的行为,并深入探讨了 `ParserConfig#getDeserializer` 方法的核心逻辑。此外,还介绍了 ASM 字节码技术的应用及其在反序列化过程中的角色。
42 10
|
8天前
|
JSON NoSQL Java
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
这篇文章介绍了在Java中使用Redis客户端的几种方法,包括Jedis、SpringDataRedis和SpringBoot整合Redis的操作。文章详细解释了Jedis的基本使用步骤,Jedis连接池的创建和使用,以及在SpringBoot项目中如何配置和使用RedisTemplate和StringRedisTemplate。此外,还探讨了RedisTemplate序列化的两种实践方案,包括默认的JDK序列化和自定义的JSON序列化,以及StringRedisTemplate的使用,它要求键和值都必须是String类型。
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
|
14天前
|
存储 Java 开发者
Java编程中的对象序列化与反序列化
【9月更文挑战第20天】在本文中,我们将探索Java编程中的一个核心概念——对象序列化与反序列化。通过简单易懂的语言和直观的代码示例,你将学会如何将对象状态保存为字节流,以及如何从字节流恢复对象状态。这不仅有助于理解Java中的I/O机制,还能提升你的数据持久化能力。准备好让你的Java技能更上一层楼了吗?让我们开始吧!
|
22天前
|
存储 Java
Java编程中的对象序列化与反序列化
【9月更文挑战第12天】在Java的世界里,对象序列化与反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何通过实现Serializable接口来标记一个类的对象可以被序列化,并探索ObjectOutputStream和ObjectInputStream类的使用,以实现对象的写入和读取。我们还将讨论序列化过程中可能遇到的问题及其解决方案,确保你能够高效、安全地处理对象序列化。
|
5天前
|
JSON 安全 编译器
扩展类实例的序列化和反序列化
扩展类实例的序列化和反序列化
12 0
|
11天前
|
XML Dubbo Java
分布式-序列化,反序列化
分布式-序列化,反序列化
|
2月前
|
存储 Java
Java编程中的对象序列化与反序列化
【8月更文挑战第28天】在Java世界中,对象序列化与反序列化是数据持久化和网络传输的关键技术。本文将深入浅出地探讨这一过程,带你领略其背后的原理及应用,让你的程序在数据的海洋中自由航行。
|
1月前
|
存储 Java
Java编程中的对象序列化与反序列化
【9月更文挑战第2天】在Java的世界里,对象序列化和反序列化就像是给数据穿上了一件隐形的斗篷。它们让数据能够轻松地穿梭于不同的系统之间,无论是跨越网络还是存储在磁盘上。本文将揭开这层神秘的面纱,带你领略序列化和反序列化的魔法,并展示如何通过代码示例来施展这一魔法。
18 0
|
2月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
下一篇
无影云桌面