设为首页 加入收藏

TOP

Java对象序列化(一)
2014-11-23 19:53:04 来源: 作者: 【 】 浏览:66
Tags:Java 对象 序列化

Java的对象序列化是指将那些实现了Serializable接口的对象转换成一个字符序列,并能够在以后将这个字节序列完全恢复为原来的对象。这一过程甚至可通过网络进行,这意味着序列化机制能自动弥补不同操作系统之间的差异。 只要对象实现了Serializable接口(记住,这个接口只是一个标记接口,不包含任何的方法


如果我们想要序列化一个对象,首先要创建某些OutputStream(如FileOutputStream、ByteArrayOutputStream等),然后将这些OutputStream封装在一个ObjectOutputStream中。这时候,只需要调用writeObject()方法就可以将对象序列化,并将其发送给OutputStream(记住:对象的序列化是基于字节的,不能使用Reader和Writer等基于字符的层次结构)。而饭序列的过程(即将一个序列还原成为一个对象),需要将一个InputStream(如FileInputstream、ByteArrayInputStream等)封装在ObjectInputStream内,然后调用readObject()即可。


对象序列化过程不仅仅保存单个对象,还能追踪对象内所包含的所有引用,并保存那些对象(这些对象也需实现了Serializable接口)。


下面这段代码演示了此过程


package test.serializable;


/**
*@chenfeic
*
*只是一个简单的类,用于测试序列化
*/
import java.io.Serializable;


public class Data implements Serializable {
private static final long serialVersionUID = 7247714666080613254L;
public int n;
public Data(int n) {
this.n = n;
}
public String toString(){
return Integer.toString(n);
}
}




package test.serializable;


import java.io.Serializable;
import java.util.Random;


/**
*
* @author chenfei
*
* 用于测试序列化,每个对象Worm对象都与worm中的下一段链接,同时又有属于不同类(Data)的对象引用数组链接
*/
public class Worm implements Serializable {
private static final long serialVersionUID = 5468335797443850679L;
private Data[] d = {
new Data(random.nextInt(10)),
new Data(random.nextInt(10)),
new Data(random.nextInt(10))
};
private static Random random = new Random(47);
private Worm next;
private char c;

public Worm(int i , char x) {
System.out.println("Worm constructor:" +i);
c = x;
if(--i > 0) {
next = new Worm(i , (char)(x+1));
}
}
public Worm() {
System.out.println("Default constructor!");
}

public String toString() {
StringBuilder sb = new StringBuilder(":");
sb.append(c);
sb.append("(");
for(Data data : d) {
sb.append(data);
}
sb.append(")");
if(next!=null) {
sb.append(next);
}
return sb.toString();
}
}




package test.serializable;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;



public class SerializableTest {

public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
Worm w = new Worm(6 ,'a');
System.out.println("序列化操纵之前");
System.out.println("w="+w);

//序列化操作1--FileOutputStream
ObjectOutputStream oos1 = new ObjectOutputStream(new FileOutputStream("worm.out"));
oos1.writeObject("Worm storage By FileOutputStream ");
oos1.writeObject(w);//必须所有引用的对象都实现序列化(本例终究是Data这个类),否则抛出有java.io.NotSerializableException:这个异常
oos1.close();

//反序列化操作1---FileInputStream
ObjectInputStream ois1 = new ObjectInputStream(new FileInputStream("worm.out"));
String s1 = (String)ois1.readObject();
Worm w1 = (Worm)ois1.readObject();
ois1.close();
System.out.println("反序列化操作1之后");
System.out.println(s1);
System.out.println("w1:"+w1);

//序列化操作2--ByteArrayOutputStream
ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
ObjectOutputStream oos

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux下用C实现Ping监测与HTTP报.. 下一篇Python向PHP发起GET与POST请求

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: