之前看公司RMI服务里多数类都实现了序列化接口(implements Serializable),但确怎么也不知道序列化是怎么一回事,上网查了很多序列化的概念,但那些概念太抽象了,还是无法理解,直到今天,终于有了一些自己的理解,在这里写出来,希望对与我存在同样困扰的朋友们能有所帮助。
我们都知道,当我们new一个对象的时候,Java就会在内存中创建一个相应的对象供我们后续使用。如果我们把这个Java程序关掉的话,那么这个对象也就随着我们程序的关闭而消失,如何才能在这种情况下继续保存这个对象呢?这就是Java序列化要做的事情。
简单地说,Java对象列化就是要把内存中的Java对象保存下来(持久化),以便可以在网络上传输或今后继续使用这个对象中的数据。
那么对象序列化到底做了哪些事呢?其实很简单,一个对象对于我们来说的意义其实就是对象里保存的那些数据,序列化就是把这些数据转换成二进制表示的对象流,你可以把它通过网络传输到远程,当然,也可以把这些信息保存在本地的文件里。下面给出一个最简单的Java的序列化与反序列化的例子,看懂这个例子,相信你应该也能跟我一样,大概理解这是怎么一回事了。
首先是一个Peraon类:
Person.java
package com.lanber.serial;
import java.io.Serializable;
public class Person implements Serializable {
private String name;
private int age;
private String sex;
private String nationality;
public Person(String _name, int _age, String _sex, String _nationality) {
this.name = _name;
this.age = _age;
this.sex = _sex;
this.nationality = _nationality;
}
public String toString() {
return "Name:" + name + "\nAge:" + age + "\nSex:" + sex
+ "\nNationality:" + nationality + "\n\n";
}
}
而后我们要实例化一个Person对象,把我们实例化出来的这个对象序列化,并把序列化后的对象流保存到文件中去:
WritePerson.java
package com.lanber.serial;
import java.io.*;
public class WritePerson {
public static void main(String[] args) {
try {
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("Person.tmp"));
Person obj = new Person("Tony", 25, "Female", "han");
System.out.println("将Person对象写入到文件Person.tmp中...");
oos.writeObject(obj);
oos.close();
System.out.println("完成!");
} catch (Exception e) {
System.out.println(e);
}
}
}
这样,我们就把序列化后的二进制对象流保存到Person.tmp的文件中去了(特别要注意这里的oos.writeObject()方法,这个方法就是实现把obj对象序列化的方法)。你可以打开生成的这个文件查看,不过我们是看不懂这里面的信息的,因为这是二进制数据啊。
那我们要怎么才能看懂这些二进制数据呢?这就要用到我们的反序列化了。反序列化就是要把序列化后的二进制数据反向解析成可以正常使用的Java对象。现在让我们来把刚才的那个对象反序列化一下吧:
ReadPerson.java
package com.lanber.serial;
import java.io.*;
public class ReadPerson {
public static void main(String[] args) {
Person obj = null;
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
"Person.tmp"));
obj = (Person) ois.readObject();
System.out.println(obj);
ois.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
要注意一下这个语句:
obj = (Person) ois.readObject();
就是通过这个语句把序列化后的对象流反序列化成正常的Java对象的。
以上就是本人对Java对象序列化与反序列化的理解,纯属入门级别的理解,若有不正之处,还望javaeye的高手们多多批评指正,不胜感激!
分享到:
相关推荐
Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven: <groupId>com.github.xsonorg</groupId> <artifactId>xson-core <version>1.0.1 ...
Java对象的序列化和反序列化是Java编程中一项重要的技术,主要用于将对象的状态转换为字节流,以便存储或在网络上传输。这一过程对于理解Java的IO操作、持久化数据以及实现分布式通信等场景非常关键。 首先,我们来...
综上,Java对象序列化和反序列化是Java开发中的基础技能,它们在数据持久化、网络通信等方面发挥着关键作用。了解并掌握这些知识,能够帮助开发者更好地设计和实现各种功能。在实际应用中,需要注意安全性和版本兼容...
1. 复杂类型的处理:除了基本类型外,还可以序列化和反序列化自定义类、结构体以及容器(如vector、map等)。对于自定义类型,通常需要重载`operator和`operator>>`,或者使用nlohmann/json库中的`to_json`和`from_...
本主题将深入探讨如何在Windows Forms(WF)环境中,利用C#语言进行对象的直接保存与读取,以及通过对象序列化和反序列化的方式实现对象的保存与恢复。 首先,我们来理解什么是对象的直接保存与读取。在C#中,可以...
### C#对象序列化与反序列化 #### 1. 对象序列化的介绍 ##### (1).NET支持对象序列化的几种方式 .NET框架提供了多种序列化机制,它们各自有不同的应用场景和特点。 - **二进制序列化**: - **定义**:二进制...