对象的序列化

来源:互联网 发布:mysql数据库设计原则 编辑:程序博客网 时间:2024/04/30 10:32

1.什么是序列化

 把Java对象转换为字节序列的过程称为对象的序列化。
 把字节序列恢复为Java对象的过程称为对象的反序列化。

   对象的序列化主要有两种用途:
  1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
  2) 在网络上传送对象的字节序列。

2.为什么需要序列化

当需要对对象进行持久化时,需要把对象以二进制序列的形式在数据库中保存。

        同理,当两个进程通过socket进行远程通信时,最终都会以二进制序列的形式交换信息。因此,发送方发送前需要把java对象转换为字节序列,而接收方则需要把字节序列解析为java对象。
3.序列化/反序列化步骤

Java语言中要求只有实现了java.io.Serializable接口的类的对象才能被序列化及反序列化。JDK类库中的有些类(如String类、包装类(Java语言用包装类来把基本类型数据转换为对象,基本类型数据有四类八种)和Date类等)都实现了Serializable接口。

  1)对象的序列化包括以下步骤。

      1.创建一个对象输出流,它可以包装一个其他类型的输出流,比如文件输出流。

      2.通过对象输出流的writeObject()写对象。

   2 )对象的反序列化包括以下步骤。

  1.创建一个对象输入流,它可以包装一个其他类型的输入流,比如文件输入流。

2.通过对象输入流的readObject()方法读取对象

  其次在对象的序列化和反序列化过程当中,必须注意的事情是:为了能读出正确的数据,必须保证对象输出流的写对象的顺序与对象输入流读对象的顺序是一致的

  通常对象中的所有属性会被序列化,但是对于一些敏感的信息(比如用户的口令),一旦被序列化后,人们就可以通过读取文件或者拦截网络传输数据的方式来偷窥这些信息。因此处于对安全原因的考虑,应该禁止对这种属性进行说序列化。解决这种办法是把这种属性用transient来进行修饰,例如以下代码。

package org.zzh.service;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;

public class User implements Serializable {
private static final long serialVersionUID = 545456546548431L;
private static final Logger logger = Logger.getLogger(User.class);
private String username;
private transient String password;

public User(String username, String password) {
this.username = username;
this.password = password;
}

@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}

public static void main(String[] args) throws ClassNotFoundException {
// TODO Auto-generated method stub
DOMConfigurator.configure("resources/LogFile.xml");
User user = new User("zzh", "123456");
logger.debug("Before Serialization");

ByteArrayOutputStream buf = new ByteArrayOutputStream();
// 创建一个对象输出流,通过对象输出流的writeObject()写入对象输出流中
try {
ObjectOutputStream out = new ObjectOutputStream(buf);
out.writeObject(user);
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("catch exception: " + e.getMessage());
}

// 创建一个对象输入流,通过对象输入流的readObject()从输入流中读取对象
try {
ObjectInputStream in = new ObjectInputStream(
new ByteArrayInputStream(buf.toByteArray()));
user = (User) in.readObject();
logger.debug("After Serialization: " + user);
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
logger.error("Exception: " + e.getMessage());
e.printStackTrace();
}
}
}


0 0
原创粉丝点击