当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。
把Java对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为Java对象的过程称为对象的反序列化。
对象的序列化主要有两种用途:
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。
Java语言中要求只有实现了java.io.Serializable接口的类的对象才能被序列化及反序列化。JDK类库中的有些类(如String类、包装类(Java语言用包装类来把基本类型数据转换为对象,基本类型数据有四类八种)和Date类等)都实现了Serializable接口。
对象的序列化包括以下步骤。
- 创建一个对象输出流,它可以包装一个其他类型的输出流,比如文件输出流。
- 通过对象输出流的writeObject()写对象。
对象的反序列化包括以下步骤。
- 创建一个对象输入流,它可以包装一个其他类型的输入流,比如文件输入流。
- 通过对象输入流的readObject()方法读取对象
其次在对象的序列化和反序列化过程当中,必须注意的事情是:为了能读出正确的数据,必须保证对象输出流的写对象的顺序与对象输入流读对象的顺序是一致的。
写道
package ser;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Date;
public class ObjectSaver {
public static void main(String[] args) throws Exception{
//1、创建一个对象输出流,它可以包装一个其他类型的输出流,比如文件输出流
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\objectFile.obj"));
String obj1 = "hello";
Date obj2 = new Date();
Customer obj3 = new Customer("WeiDong",24);
//2、通过对象输出流的out.writeObject()写对象——序列化对象
out.writeObject(obj1);
out.writeObject(obj2);
out.writeObject(obj3);
out.close();
//3、创建一个对象输入流,它可以包装一个其他类型的输入流,比如文件输入流——反序列化对象
ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\objectFile.obj"));
String obj11 = (String)in.readObject();
System.out.println(obj11);
System.out.println("obj11==obj1:" + (obj11==obj1));
System.out.println("obj11.equals(obj1):" + (obj11.equals(obj1)));
Date obj22 = (Date)in.readObject();
System.out.println(obj22);
System.out.println("obj22==obj2:" + (obj22==obj2));
System.out.println("obj22.equals(obj2):" + (obj22.equals(obj2)));
Customer obj33 = (Customer)in.readObject();
System.out.println(obj33);
System.out.println("obj33==obj3:" + (obj33==obj3));
System.out.println("obj33.equals(obj3):" + (obj33.equals(obj3)));
in.close();
}
}
package ser;
import java.io.Serializable;
public class Customer implements Serializable {
private String username;
private int age;
public Customer(String username,int age) {
this.username = username;
this.age = age;
}
@Override
public boolean equals(Object o) {
if(this==o) {
return true;
}
if(!(o instanceof Customer)) {
return false;
}
final Customer other = (Customer)o;
if(this.username.equals(other.username)&&(this.age==other.age)) {
return true;
}else {
return false;
}
}
@Override
public String toString() {
return "username = " + username + "age = " + age;
}
}
通常对象中的所有属性会被序列化,但是对于一些敏感的信息(比如用户的口令),一旦被序列化后,人们就可以通过读取文件或者拦截网络传输数据的方式来偷窥这些信息。因此处于对安全原因的考虑,应该禁止对这种属性进行说序列化。解决这种办法是把这种属性用transient来进行修饰,例如以下代码。
package ser;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/*
* 属性包括用户名username和密码password
* 构造方法来为对象的属性赋予合适的值
*/
public class User implements Serializable{
private String username;
private transient String password;
public User(String username,String password) {
this.username = username;
this.password = password;
}
@Override
public String toString() {
return username + "" + password;
}
public static void main(String[] args) throws Exception{
User user = new User("WeiDong","123456");
System.out.println("Before Serialization:" + user);
ByteArrayOutputStream buf = new ByteArrayOutputStream();
//创建一个对象输出流,通过对象输出流的writeObject()写对象到输出流中
ObjectOutputStream out = new ObjectOutputStream(buf);
out.writeObject(user);
out.close();
//创建一个对象输入流,通过对象输入流的readObject()从输入流中读取对象
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(buf.toByteArray()));
user = (User)in.readObject();
System.out.println("After Serialization:" + user);
in.close();
}
}
分享到:
- 2009-08-18 00:21
- 浏览 671
- 评论(1)
- 论坛回复 / 浏览 (0 / 2937)
- 查看更多
相关推荐
Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven: <groupId>com.github.xsonorg</groupId> <artifactId>xson-core <version>1.0.1 ...
对象序列化和反序列化流
c#对象 序列化 和 反序列化 ,压缩流
java对象 java序列化 java反序列化
java 对象的序列化与反序列化 java 对象的序列化与反序列化
1.对象序列化的介绍 (1).NET支持对象序列化的几种方式 二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下。 SOAP...
什么叫反序列化? 就是再把介质中的东西还原成对象,把石子还原成人的过程。 在进行这些操作的时候都需要这个可以被序列化,要能被序列化,就得给类头加[Serializable]特性。 通常网络程序为了传输安全才这么做。不...
c#对象序列化与反序列化实例c#对象序列化与反序列化实例c#对象序列化与反序列化实例c#对象序列化与反序列化实例c#对象序列化与反序列化实例c#对象序列化与反序列化实例
把字节序列恢复为Java对象的过程称为对象的反序列化。 对象的序列化主要有两种用途: 1)把对象的字节序列地保存到硬盘上,通常存放在一个文件中; 2)在网络上传送对象的字节序列。 一、JDK类库...
C# xml序列化及反序列化(解析xml为对象及对象转xml保存),方法一反序列化取节点KV值,方法二反序列化取节点标签值,方法三取节点KV值,并增加节点对象数组及节点标签组合反序列化
主要介绍了Java中对象序列化与反序列化,较为详细的分析了java中对象序列化的概念、原理、实现方法及相关注意事项,具有一定参考借鉴价值,需要的朋友可以参考下
通过一个章节来讲解序列化与反序列化,对binaryformatter soapformatter xmlserializer这三种序列化的详情讲解,希望对大家有所帮助。
JAVA对象的序列化与反序列化详细PPT课件.pptx
NULL 博文链接:https://chenfengcn.iteye.com/blog/375830
基于WindowForm应用程序C#语言通过实际案例实现将对象保存到文件及从已保存的文件中读取对象(直接保存与读取、通过序列化与反序列化方式进行对象保存与读取)
通过实现 Serializable 接口,Java对象可以被序列化和反序列化。序列化可以将对象转换为字节流,以便于存储或传输。反序列化则可以将字节流重新转换为原始对象。需要注意的是,序列化和反序列化的类必须具有相同的 ...
比如下面的JS对象 var user=new Object(); user.name='吕洞宾'; user.friends=[{name:"铁拐李",sex:"男",friend:user},{name:"何仙姑",sex:"女",friend:user}]; 一般的解析工具都会出错 详细信息请参观 ...
Vbs序列化/反序列化Json基类 可直接使用,bug已被我修复 Example: Dim fso, json, str, o, i Set json = New VbsJson Set fso = WScript.CreateObject("Scripting.Filesystemobject") str = fso.OpenTextFile(...
这是一个用C#写的Socket服务器和客户端,当然Socket服务器和客户端不是主要的(有兴趣的朋友可以参考下),主要的内容是介绍如何通过这种Socket方式发送Object对象。 作者博客 http://luyugao.com