黑马程序员技术交流社区
标题:
关于对象序列号的问题 求教!!!
[打印本页]
作者:
黄敏
时间:
2012-9-17 20:45
标题:
关于对象序列号的问题 求教!!!
本帖最后由 黄敏 于 2012-9-17 20:50 编辑
77、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。
答案: 我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java对象变成某个格式的字节流再传输,但是,jre本身就提供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java 帮我们做,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。需要被序列化的类必须实现Serializable接口,该接口是一个mini接口,其中没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的。
例如,在web开发中,如果对象被保存在了Session中,tomcat在重启时要把Session对象序列化到硬盘,这个对象就必须实现Serializable接口。如果对象要经过分布式系统进行网络传输或通过rmi等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现Serializable接口。
上面的概念是理解了 但是新的问题又来了
对象序列化为什么存在?出现的目的是干嘛的?最实在用作用在哪 实际应用有哪些 需要能举个典型的例子解释其应用
作者:
冯心程
时间:
2012-9-17 21:11
序列的根本应该是为了保存数据 保存状态总得有个顺序 序列化就是把内存中对象以一种可以保存的形式保存起来
场景当然在操作对象的时候
作者:
孙沛
时间:
2012-9-17 21:17
序列化是把对象中的数据转换成二进制表示的对象流,你可以把它通过网络传输到远程,当然,也可以把这些信息保存在本地的文件里。举个例子
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的文件中去了
作者:
史小兵
时间:
2012-9-17 21:39
首先注意序列化机制允许将实现序列化的java对象转换成为字节序列,这些字节序列可以保存在硬盘上,或是通过网络传输,以备以后恢复对象。序列化机制使的对象可以脱离程序而独立运行!
有序列化自然就有反序列化:
先定义一个person类
public class Person
implements java.io.Serializable
{
private String name;
private int age;
// 注意此处没有提供无参数的构造器!
public Person(String name , int age)
{
System.out.println("有参数的构造器");
this.name = name;
this.age = age;
}
// 省略name与age的setter和getter方法
// name的setter和getter方法
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
// age的setter和getter方法
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return this.age;
}
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
{
// 将name Field的值反转后写入二进制流
out.writeObject(new StringBuffer(name).reverse());
out.writeInt(age);
}
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException
{
// 将读取的字符串反转后赋给name Field
this.name = ((StringBuffer)in.readObject()).reverse()
.toString();
this.age = in.readInt();
}
}
现在讲一个person对象写到磁盘上:
public class WriteObject
{
public static void main(String[] args)
{
try(
// 创建一个ObjectOutputStream输出流
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("object.txt")))
{
Person per = new Person("孙悟空", 500);
// 将per对象写入输出流
oos.writeObject(per);
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}
下面示范从感刚刚生成的object.txt文件中读取person对象:
public class ReadObject
{
public static void main(String[] args)
{
try(
// 创建一个ObjectInputStream输入流
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("object.txt")))
{
// 从输入流中读取一个Java对象,并将其强制类型转换为Person类
Person p = (Person)ois.readObject();
System.out.println("名字为:" + p.getName()
+ "\n年龄为:" + p.getAge());
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}
希望这些对你会有帮助!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2