java对象序列化序列化代码分析

本文介绍了一个简单的Java学生信息类的序列化实现,并演示了如何通过对象输入输出流进行对象的保存与读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[quote="clumsy birds"]
[b]Student的封装类[/b]

package org.tarena.day03;

import java.io.Serializable;

@SuppressWarnings("serial")
public class Student implements Serializable{
//使对象序列化;
private int id;
private String name;
private char sex;
private /*transient*/int age;//transient 只能用来修饰属性。表示这个属性在对象序列化时将被忽略。
/* transient int num;
表示当我们对属性序列化时忽略这个属性(即忽略不使之持久化)。
所有属性必须都是可序列化的,特别是当有些属性本身也是对象的时候,要尤其注意这一点。
*/
public Student(int id, String name, char sex, int age) {
super();
this.setId(id);
this.setName(name);
this.setSex(sex);
this.setAge(age);
}
public Student() {
super();
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
@Override
public boolean equals(Object obj) {
if(obj == null) return false;
if (obj instanceof Student) {
Student stu = (Student) obj;
return stu.name.equals(this.name)&&(stu.id+"").equals(this.id);
}
return false;
}
@Override
public String toString() {
return id+","+name.toString()+","+sex+","+age;
}
}

[/quote]

[quote="clumsy birds"]
[b]测试实现[/b]

package org.tarena.day03;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
//对象序列化;
public class StudentTest {

static void setStudent(File fl,Student stu) throws Exception{
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream(fl));
out.writeObject(stu);
out.close();
out.flush();
}
static void getStudent(File fl) throws Exception{
ObjectInputStream in = new ObjectInputStream(
new FileInputStream(fl));
Student stu = (Student)in.readObject();
System.out.println(stu);


}
public static void main(String[] args) throws Exception{
Student stu = new Student(1,"张三",'男',23);
File fl = new File("/home/soft22/Desktop/abc.txt");
setStudent(fl,stu);
getStudent(fl);

}

}


[/quote]
[quote="clumsy birds"]
[img]http://anzhoujava.iteye.com/upload/picture/pic/66658/de4e791b-1e02-3adb-8d6b-6601a7232e2c.jpg[/img]
[u]运行结果:[b]1,张三,男,23[/b][/u]
[/quote]

[quote="clumsy birds"]
[b]对 象 流 读 取 结 束 返 回 E O F Exception 异 常 对象[/b]
一个类中有其他类型的对象,那么,这个类实现了 Serializable 接口,在对象序列化时,也同样要求这个类
中属性都能够对象序列化(基本类型除外)。
注意:对于对象流的操作,在写对象时要一次写入完毕,如果使用追加模式写入,只会读取到上一次写入的
对象,使用对象流写入时,会先写入一个头部,然后写入数据,最后加上结束符号,如果使用追加方式写入
的话,那就会在结束符号继续向下写入,但是在读取时只会读到结束符为止,以后再次写入的数据就会丢失。
[u]注意:在使用对象流写入对象时要一次向文件写入,不能够采用追加方式。[/u]
serialver 命令判断是否一个属性或对象可序列化,
serialver TestObject(TestObject 必须为已经编译,也就是.class)
执行结果:如果不可序列化;则出现不可序列化的提示。如果可以序列化,那么就会出现序列化的 ID:UID。
Externalizable 这是 Serializable 的子接口,他可以让用户自定义如何序列化对象。
readExternal(ObjectInput in),writeExternal(ObjectOutput out)这是这个接口中的两个方法,通过这两个方法可以定制序列化过程。这个方法不安全,可以调用以上两个方法改变对象的状态。

[u]transient 只能用来修饰属性。表示这个属性在对象序列化时将被忽略。
transient int num;
表示当我们对属性序列化时忽略这个属性(即忽略不使之持久化)。所有属性必须都是可序列化的,特别是当有些属性本身也是对象的时候,要尤其注意这一点。[/u]

java.util.StringTokenizer 类,这个类是用于字符串截取的。
StringTokenizer(参数 1,参数 2)按某种符号隔开文件
StringTokenizer(s,”:”) 用“:”隔开字符,s 为对象。
补充:字节流结束返回-1,字符流结束返回 null,对象流结束返回 EOFException
引申---------〉异常经常被用在流程控制, 异常也是方法的一种返回形式。

[/quote]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值