最近学习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序列化,里面包含一份PPT以及相应的源码演示
java序列化(Serializable)的作用和反序列化.doc 有详细的讲解哦。 在什么地方用的到都有说明的.
java 序列化详细解释 很详细 适用于高级软件开发者
java序列化代码示例,详细讲解序列化作用于使用注意规则项!!!
Java SE编程入门教程 java序列化(共14页).pptx Java SE编程入门教程 java异常(共57页).pptx Java SE编程入门教程 java正则(共8页).pptx Java SE编程入门教程 properties(共3页).pptx Java SE编程入门教程 ...
序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例...虽然你可以用你自己的各种各样的方法来保 存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
大家请看Java的序列化结构有不足的地方请指教也希望指出不足的地方。
java序列化和反序列化java序列化和反序列化java序列化和反序列化
将java数据 序列化成PHP的格式 a:4:{s:6:"title2";s:13:"这是标题2";s:6:"title3";s:13:"这是标题3";s:5:"title";s:13:"这是标题1";s:6:"title4";s:13:"这是标题4";} 或者a:1:{i:0;a:1:{s:4:"name";s:10:"这是1321";...
在应用java进行c-s开发的时候,尤其涉及到图片和视频之间的传输时,需要用序列化和反序列化技术,希望对您有帮助
该资源提供了java常见的三个序列化框架,分别是:JBoss Marshalling,messagePack,protobuf-java
07-Java序列化面试题(10题)-新增
java 序列化,java 序列化,java 序列化,java 序列化,java 序列化,java 序列化
NULL 博文链接:https://hw1287789687.iteye.com/blog/2190768
E043-服务漏洞利用及加固-利用Java序列化漏洞进行渗透测试
java序列化是面试中经常涉及的重要主题之一。对Java序列化的深入了解不仅可以展示你的编程技能,还能体现出你对Java核心概念的掌握。本文精选了20道复杂的Java序列化面试题,并提供了详细的解析,旨在帮助你更好地...
Java序列化与反序列化 Java序列化与反序列化 Java序列化与反序列化 Java序列化与反序列化 Java序列化与反序列化
Java序列化机制(2)- serialVersionUID 实验 http://blog.csdn.net/suileisl/article/details/16991753
android(包括java)序列化一个对象传给php去做处理,或是接到php的序列化的对象在java中做处理的工具jar包以及使用方法. 使用方法: byte[] b = null; b = PHPSerializer.serialize(一个对象);//将一个对象序列化后返回...
详细讲解了java的序列化用处、原理、算法、如何实现。希望能帮到大家。