小说网站开发l,网站域名icp 备案价格,网络服务器销售商,瑜伽wordpress模板Java对象的序列化机制 Java对象的序列化#xff0c;是将内存中的java对象转化为二进制的字节流#xff0c;然后保存到磁盘中或者在网络上。这就是序列化对象#xff0c;反序列化顾名思义就是将对象的二进制字节流恢复成原来的对象。注意只有对象的类名和属性能被序列化… Java对象的序列化机制 Java对象的序列化是将内存中的java对象转化为二进制的字节流然后保存到磁盘中或者在网络上。这就是序列化对象反序列化顾名思义就是将对象的二进制字节流恢复成原来的对象。注意只有对象的类名和属性能被序列化包括基本类型数组对其他对象的引用不包括方法static属性(静态属性)transient属性(瞬态属性)都不会被序列化。 那什么叫做序列化的对象呢在Java中不是所有类都是序列化类如果一个类要实现序列化就必须实现下面两个接口之一: (1)Serializable接口 (2)Externalizable接口 对于这两个接口的区别后面就会知道的我们先把类都实现Serializable接口这个接口java没有提供任何的方法java设计他只是作为一个类的序列化的标志表明此类可以进行序列化。 如果要讲java对象转化为二进制的字节流并写出就一定需要对象的流来进行输出所以这里用到ObjectOutputStream类这个输出流是一个处理流所以需要创建一个字节输出流然后用这个处理流进行包装所以处理流也叫作包装流。反之ObjectInputSteam是将对象写入的类。写出的对象方法是ObjectOutputStem对象.writeObject(序列化对象的实例)。写入的方法是ObjectInputStream的对象.readObject(序列化的对象);说了这么多我就做一个例子吧。。 代码创建一个实现序列化的Person类 public class Person implements Externalizable {private String name;private int age;public Person1(String name,int age) {this.namename;this.ageage;//这个地方用于测试序列化和反序列化对象时候实例化类的情况System.out.println(带参数的构造器的使用);}public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;}} 代码创建测试类进行测试 public static void main(String[] args) throws IOException {//如果处理流当关闭流的时候就不需要再将节点流进行关闭了//这是对对象进行写出的操作(序列化对象)FileOutputStream fosnull;ObjectOutputStream oosnull;try {fosnew FileOutputStream(new File(E://javatest.txt));oosnew ObjectOutputStream(fos);Person pernew Person(孙悟空,66);oos.writeObject(per);} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {if(oos!null) {oos.close();}}//这是对对象进行写入的操作(反序列化对象)FileInputStream fisnull;ObjectInputStream oisnull;try {fisnew FileInputStream(E://javatest.txt);oisnew ObjectInputStream(fis);//处理流将文件的字节流进行包装//将对象反序列化写入的时候得到的都是Object类型的数据必须进行强制类型的转化Person per(Person)ois.readObject();System.out.println(姓名per.getName()年龄per.getAge());} catch (Exception e) {e.printStackTrace();} finally {if(ois!null) {ois.close();}}} readObject方法会抛出ClassNotFoundException异常也就是说当反序列化时候找不到对应的java类会将引发这个异常因为反序列化读取的仅仅是java对象的数据而不是java类因此采用反序列化恢复java对象时必须提供该java对象所属类的class文件否则就会引发该异常。 输出结果可以看出当反序列化的时候构造器没有执行也就是反序列化类无需通过构造器来进行初始化java对象 注如果我们向文件中使用序列化机制写入多个java的对象使用反序列化机制恢复对象时必须按实际的写入顺序读取。 Y(^o^)Y属性是引用类型的对象的序列化 我们上面所说的属性都是String类型和基本类型如果我们需要一个引用类型呢那么这个引用类型也必须是可序列化的类否则拥有该类型的属性类不可序列化。下面我将要定义一个引用类型的属性重新创建一个Teacher类引用属性必须实现序列化否则Treacher不论实现不实现(1)Serializable接口 (2)Externalizable接口这两个接口他都不是序列化的类因为当对象序列化的时候会顺带着把引用类型的属性进行序列化所以要想Teacher是序列化的类则必须将Person的类进行序列化。 代码Teacher类 public class Teacher implements Serializable {private String name;private Person student;//引用类型的属性(这个Person类就是上面实现序列化的类)public Teacher(String name,Person student) {this.namename;this.studentstudent;System.out.println(带参数的构造器的使用);}public String getName() {return name;}public void setName(String name) {this.name name;}public Person getStudent() {return student;}public void setStudent(Person student) {this.student student;}
} 代码 测试代码 public static void main(String[] args) throws IOException {// TODO Auto-generated method stub
FileOutputStream fosnull;ObjectOutputStream oosnull;Person pnew Person(孙悟空,66);Teacher t1new Teacher(玄奘法师,p);Teacher t2new Teacher(菩提祖师,p);try {fosnew FileOutputStream(new File(E://javatext.txt));oosnew ObjectOutputStream(fos);oos.writeObject(t1);oos.writeObject(t2);oos.writeObject(p);oos.writeObject(t1);} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if(oos!null) {oos.close();}}}
} 分析这段代码可以看出我创建出来了三个类。Person pnew Person(孙悟空,66);Teacher t1new Teacher(玄奘法师,p);Teacher t2new Teacher(菩提祖师,p);如果我将这三个类进行对象的序列化的话t1写出并且Person类也会进行序列化同理t2也是然后我们又显示序列化了Person类所以Person类在此次写出中被序列化了三回那么对于t1,t2来说实际上他们的Person类是同一个但是如果Person序列化三回的话t1,t2就没有引用同一个Person类这显然是不符合实际情况的。Java对此采用了一种特殊的序列化算法算法的内容是 (1)所有保存到磁盘中的对象都有一个序列化编号。 (2)当程序师徒序列化一个对象的时候程序将先检查对象是否已经序列化过只有当该对象从未(在本次虚拟机中)被序列化过系统才会将该对象转化成字节序列并输出。 (3)如果某个对象是已经序列化过的程序将直接只是输出一个序列化编号而不是重新序列化该对象。 Y(^o^)Y序列化的对象是可变的类 根据java的序列化机制当我先写进去序列化的时候如果我改变了可变类的属性值那么当我想再次进行序列化的时候就不能把更改后的值序列化了因为java的序列化机制当在此序列化同一的对象的时候输出的是一个序列化编号。程序会比较两个对象是同一个对象就不会把对象重新的序列化。就是更改后的对象并没有被写入。这再次验证了java的序列化机制。 代码 测试类 public class VolatileClassTest {/*** 序列化可变类* param args* throws IOException * throws ClassNotFoundException */public static void main(String[] args) throws IOException, ClassNotFoundException {// TODO Auto-generated method stub
FileOutputStream fosnull;ObjectOutputStream oosnull;FileInputStream fisnull;ObjectInputStream oisnull;try {//进行序列化的操作fosnew FileOutputStream(new File(E://javatest.txt));oosnew ObjectOutputStream(fos);Person pnew Person(孙悟空,600);oos.writeObject(p);//将对象进行序列化p.setName(红孩儿);//可变类将姓名属性设置为红孩儿,可变类oos.writeObject(p);//将更改后的类进行序列化//进行反序列化操作fisnew FileInputStream(new File(E://javatest.txt));oisnew ObjectInputStream(fis);Person per(Person)ois.readObject();//输出的姓名还是孙悟空再次验证了java的序列化机制System.out.println(姓名是per.getName());} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if(oos!null) {oos.close();}if(ois!null) {ois.close();}}}
} 转载于:https://www.cnblogs.com/dukc/p/4823710.html