黑马程序员——ObjectInputStream和ObjectOutputStream

-------android培训java培训java学习型技术博客、期待与您交流! ----------

可以直接操作对象的流:ObjectInputStream和ObjectOutputStream

流是操作数据的,但是数据被封装到对象里面了,对象里的数据都是字节码数据,不是文本。
把对象存储到硬盘上叫对象的持久化存储,或者叫对象的序列化或叫对象的可串行性。


注意:静态的成员是不能被序列化的,因为静态的成员存在于方法区中,而对象是存在于堆内存中的,序列化对象,只能序列化堆内存中的数据。即:类中的静态成员是不能被保存到硬盘中的。即序列化只能将堆内存中的数据保存到硬盘上。


而要想让类中的非静态成员(即堆内存中的数据)也不让它序列化,则要用到一个修饰词:transient
比如:transient int age;


只能将支持java.io.Serializable 接口的对象写入流中,就你要写入流中的对象必须实现Serializable接口,才能白流操作。


ObjectOutputStream 将java对象的基本数据类型和图形写入到OutputStream.可以使用ObjectInputStream读取(重构)对象。
ObjectOutputStream的作用是将流和对象相关联,所以它构造时必须要有流。
Serializable接口:类通过实现java.io.Serializable 接口以启用其序列化功能,为实现此接口的类是将无法使其任何状态序列化或反序列化。并且此接口中没有方法,即:实现它后不用重写其方法。
像这种没有方法的接口,称之为标记接口。标记接口其实就是给类加一个可序列化的标记。
Serializable接口的原理:就是这个接口给类加了一个serialVersionUID.就是加了个ID号,如果一个类可序列化的话,都希望它有一个ID表示,此ID表示是给编译器用的。因为当一个类产生了一个对象之后,并且这个对象被持久化固定存在了之后(被存入到硬盘上)被序列化以后(持久化),但是此对象对应的类是可能被修改的,如果被修改以后,在重新编译时它会产生一个新的序列号,那么就会造成原来持久化的对象和这个新的类可能会不匹配,所以它用序列号是否相同来判断,这个对象和类是否是匹配的。
UID是根据类中的成员来算出来的。


void write(int val)和void writeInt(int val)的区别,第一个是字节流都有的方法,将一个int类型数据的最后一个字节写出去。第二个是把int类型的数据的四个字节都写出去。


void writeObject(Object obj):此方法是结束一个对象。它的构造函数中接收输出流,而写出的方法writerObject()来接收对象。
*/
import java.io.*;


class ObjectStreamDemo
{
public static void main(String[] args)
{
writeObj();
readObj();
}
//将对象中的数据写出到一个文件中。
public static void writeObj() throws IOException
{
ObjectOutputStream oos=
new ObjectOutputStream(new FileOutputStream("person.object"));
oos.writeObject(new Person("lisi2",32,"kr")


oos.close();
}
public static void readObj()throws Exception
{
  ObjectInputStream ois =new ObjectInputStream(new FileInputStrenm("person.object"));


Person p=(Person)ois.readObject();

System.out.println(P);
//结果是lisi2,年龄和国籍是读不出来的,因为他们就不存在于文件中,年龄是被transient修饰的,国籍是
//静态的。
ois.close();
}

}
class Person implements Serializable
{
public static final long serialVersionUID =43L;
//自定义UID。这样就算你把类修改了,存在硬盘上的对象文件,也能读取到,因为他们的UID都是一样的,
//固定的为43L。


private String name;
transient int age;
static String country="cn";
Person(String name,int age,String country)
{
this.name=name;
this.age=age;
this.country=country;
}
public String toString()//复写了toString()方法,就可以直接打印了,要不得通过set和get获取
{
return name+"::"+age+"::"+country;
}

}

------- android培训java培训java学习型技术博客、期待与您交流! ----------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值