最近学习java序列化收获颇多。谈到序列化,不得不得说说为什么需要序列化?序列化的作用是把OOP编程中的对象转变为字节流然后存储到持久化的存储设备上。当从存储设备上读出这些序列化的消息并构建成对象这个过程称为反序列化。在面向对象的编程中,我们经常需要存储的不再是一些简单的变量,而是针对对象来存储。这在java的应用领域里实为常见。接下来我将谈谈java中序列化时怎么实现的。
首先,要序列化一个对象,必须实现java.io. Serializable接口,该接口中不含有任何方法,我觉得其作用是可以统一编程接口一次标识某个类可以序列化。在某些时候,我们也许并不想序列化所有的对象数据属性,我们可以采用关键字transient(表明对象为一个瞬时对象)声明,还可以把这些字段声明为static也不会被序列化。
其次,我们要从上知道了声明一个对象可以序列化,但究竟怎么去实现,我们可以这样去思考,由于我们是想把对象转变为字节流(序列化),以及从字节流转变为对象(反序列化),在java中必须实现writeObject和readObject方法,若该对象不覆盖这两个方法将会采用java默认的方法。在此以一个实例进行说明:
序列化一个对象:
package com.yx.serialization;
import java.io.Serializable;
publicclass SerializeStudent implements Serializable{
/**
* 序列化标识ID,用于在反序列化化时使用
* 反序列化的时候,如果内存中已经有了这个标识,则认为是同一类对象
*/
privatestaticfinallongserialVersionUID = 1L;
/*瞬时对象,不会被序列化*/
publictransient String m_nClass=null;
/*成员属性*/
private String m_StudentName=null;
public String m_Dept = null;
public void setStudentName(String name)
{
m_StudentName = name;
}
public void setDept(String dept)
{
m_Dept = dept;
}
public void setClass(String age)
{
m_nClass = age;
}
@Override
public String toString()
{
return"学生姓名:"+m_StudentName+",系 (静态字段):" +m_Dept+",班级:(瞬时字段):"
+m_nClass;
}
}
序列化测试以及反序列化
package com.yx.serialization;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
publicclass TestSerializable {
/**
* @param args
* @throws IOException
*/
publicstaticvoid main(String[] args) throws Exception {
// TODO Auto-generated method stub
/*序列化的文件路径*/
String filePath="E://seriable.out";
SerializeStudent Student = new SerializeStudent();
SerializeStudent nStudent = new SerializeStudent();
Student.setStudentName("Labixiaoxin");
Student.setDept("Computer Sicence");
Student.setClass("grade 1");
writeObjectTest(filePath,Student);
readObjectTest(filePath);
}
privatestaticvoid writeObjectTest(String filePath,Object obj) throws IOException
{
/*构造序列化流,也就是以流的形式写入文件*/
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = new FileOutputStream(filePath);
oos = new ObjectOutputStream(fos);
oos.writeObject(obj);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(fos!=null)
{
fos.close();
}
if(oos!=null)
{
oos.close();
}
}
//清空静态字段,以免在后面反序列化时出现混淆
((SerializeStudent)obj).setDept(null);
}
privatestaticvoid readObjectTest(String filePath)
{
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
fis = new FileInputStream(filePath);
ois = new ObjectInputStream(fis);
SerializeStudent obj = new SerializeStudent();
obj =(SerializeStudent) ois.readObject();
System.out.println("信息:"+obj);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出结构:
信息:学生姓名:labixiaoxin,系(静态字段):null,班级:(瞬时字段):null
从输出结构我们可以看见,静态字段和瞬时字段为null,说明这两个字段并未序列化,也就是并未存入我们的磁盘中去。
相关推荐
Java序列化是Java平台中的一种标准机制,允许将对象的状态转换为字节流,以便存储在磁盘上、通过网络进行传输或者在某些时候恢复原来的对象状态。这一过程包括两个主要步骤:对象的序列化(将对象转换为字节流)和反...
Java序列化是Java平台中的一种持久化机制,它允许对象的状态被转换成字节流,以便存储、网络传输或在不同时间点恢复。这个过程被称为序列化,而反向操作称为反序列化。序列化在许多场景下都非常有用,比如在分布式...
java 序列化和反序列化的方法 Java 序列化和反序列化是 Java 语言中的一种机制,用于将对象转换为字节流,以便在网络上传输或存储。序列化是将对象转换为字节流的过程,而反序列化是将字节流转换回对象的过程。 在...
### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...
【Protocol Buffer序列化对比Java序列化】 Protocol Buffer(简称PB)是Google开发的一种高效的数据序列化协议,而Java序列化是Java平台内置的一种序列化机制。两者的主要目标都是将对象转化为字节数组,便于在网络...
Java序列化是Java平台提供的一种持久化机制,它允许我们将一个Java对象转换为字节流,以便存储到磁盘上,或者通过网络进行传输。这使得我们可以保存和恢复对象的状态。实现序列化的类需要实现`Serializable`接口,...
Java序列化是Java平台中的一种核心机制,它允许对象的状态被转换成字节流,以便存储到磁盘、数据库,或者在网络中进行传输。这对于实现持久化、远程方法调用(RMI)以及Enterprise JavaBeans(EJB)等高级功能至关...
### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化是什么? 序列化是指将程序中的对象转换为字节流的过程,从而方便存储或传输这些对象。通常,序列化用于将对象的状态(即其实例变量的值,而非...
Java序列化是Java平台中的一种标准机制,它允许将对象的状态转换为字节流,以便存储、传输或恢复。在Java中,一个类如果要实现序列化,需要实现`Serializable`接口,这是一个标记接口,不包含任何方法。下面我们将...
Java序列化是Java平台中的一项重要技术,它允许对象的状态被转换为字节流,以便存储或通过网络进行传输。这种技术在分布式系统、持久化存储以及数据交换等场景中非常常见。本资源包含了三个流行的Java序列化框架:...
Java序列化是Java平台提供的一种将对象转换为字节流,以便存储、在网络上传输或者在后续时间重新创建相同对象的机制。这是Java编程中一个非常重要的概念,尤其是在分布式环境和持久化存储中。让我们深入探讨一下Java...
### Java序列化原理与算法详解 #### 序言 在现代软件开发中,尤其是在网络通信和数据持久化领域,对象的序列化与反序列化扮演着至关重要的角色。Java作为一种广泛应用的编程语言,提供了强大的内置支持来实现序列化...
Java序列化面试题(10题) 在 Java 中,序列化是一种用于处理对象流的机制,它可以将对象的内容进行流化,使其可以被读写和传输。下面是 10 个与 Java 序列化相关的面试题目: 1. 什么是 Java 序列化,如何实现 ...
Java序列化是Java平台中的一种标准机制,允许对象的状态被保存到磁盘或者在网络中进行传输,以便在后续的时间或地点恢复这些对象。这个过程包括两个主要操作:序列化(将对象转换为字节流)和反序列化(将字节流恢复...
Java序列化是Java平台提供的一种持久化对象的机制,它允许我们将对象的状态转换为字节流,以便存储或在网络上传输。在这个特定的场景中,我们关注的是如何使用Java序列化来多次追加对象到一个TXT文件,而不是覆盖...
### Java序列化与反序列化详解 #### 一、Java序列化概述 Java序列化(Serialization)是一项重要的功能,它可以将对象的状态转化为一系列字节,从而实现对象的持久化存储或在网络上传输。序列化机制使得Java对象...
### Java对象序列化标准知识点详解 #### 一、系统架构概览 **1.1 概览** Java 对象序列化是一种将Java对象的...以上内容涵盖了Java序列化标准的关键知识点,深入了解这些概念有助于更好地理解和应用Java序列化技术。
Java序列化漏洞是一种常见的安全问题,它出现在Java应用程序中,当对象被转化为字节流以便在网络间或存储中传输时。这种序列化过程如果处理不当,可能会导致远程代码执行(RCE)、信息泄露或者权限提升等严重后果。...
android(包括java)序列化一个对象传给php去做处理,或是接到php的序列化的对象在java中做处理的工具jar包以及使用方法. 使用方法: byte[] b = null; b = PHPSerializer.serialize(一个对象);//将一个对象序列化后返回...
Java序列化是将Java对象转换为字节流的过程,以便可以在网络上传输或存储在磁盘上。这使得数据能够跨不同的系统平台进行传输和持久化。Protocol Buffers(protobuf)是Google推出的一种高效、跨平台的数据序列化协议...