java序列化 对象序列化 静态数据是否保存? 序列化真是好东西

来源:互联网 发布:如何ping端口通不通 编辑:程序博客网 时间:2024/06/01 19:43
package day13.IO2;//}如何判断一个 文本是否读完对象???????????????import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.util.ArrayList;import java.util.Iterator;class Person  implements Serializable{private String name  ;private int age;private static  int a =0;public static int getA() {return a;}public static void setA(int a) {Person.a = a;}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 Person(){this.name = "x";this.age = 1;}public Person(String name, int age) {super();this.name = name;this.age = age;}public String toString(){return this.getName()+"  "+this.getAge();}}public class ObjectInputSreamDemo {public static void main(String [] args) {singleObject();//ArrayObject();//序列化一个对象数组}public static void ArrayObject(){Person [] a =  {new Person(),new Person(),new Person()};writeArrayObject(a);readArrayObject("c:\\a.txt");}public static void readArrayObject(String a){try{ObjectInputStream ois = new ObjectInputStream(new FileInputStream(a));ArrayList <Person>arr = new ArrayList<Person>();Person p = null;//while(( p = (Person)ois.readObject())!=null)//{//arr.add(p);//}如何判断一个 文本是否读完对象???????????????arr.add((Person)ois.readObject());arr.add((Person)ois.readObject());p = (Person)ois.readObject();arr.add(p);p = (Person)ois.readObject();System.out.println(p==null);Iterator<Person> it = arr.iterator();while(it.hasNext()){p = it.next();System.out.println(p.getAge()+" "+p.getName());}}catch(FileNotFoundException e ){e.printStackTrace();}catch(IOException e){e.printStackTrace();}catch(ClassNotFoundException e){e.printStackTrace();}}public static void writeArrayObject(Object [] a){try{ObjectOutputStream boo = new ObjectOutputStream(new FileOutputStream("c:\\a.txt"));for(int i = 0 ; i<a.length;i++){if(!( a[i]instanceof Person )){System.out.println("err : ");System.exit(0);}{boo.writeObject(a[i]);}}System.out.println("写完成");boo.close();}catch(FileNotFoundException e ){e.printStackTrace();}catch(IOException e){e.printStackTrace();}}public static void singleObject(){Person a  =new Person();System.out.println("默认值"+Person.getA());Person.setA(10);//定义一个序列化和反序列化的 输入输出流ObjectOutputStream oos = null;ObjectInputStream ois  = null;try{oos= new ObjectOutputStream(new FileOutputStream("c:\\a.txt"));System.out.println("序列化前  应该为10?"+Person.getA());oos.writeObject(a);System.out.println("序列化写入文本后  反序列化前 也应该是10?  "+Person.getA()); ois  =new ObjectInputStream(new FileInputStream("c:\\a.txt"));Person p = (Person)ois.readObject();System.out.println("反序列化后  应该是0!!!"+Person.getA());/** * 对于上面的认识存在误区  刚开始被书上的内容绕进去了  * 序列化时 类的静态变量不能存入文件的 是不能被序列化的  ,反序列化只要在运行环境中找到一份 * .class 文件 即可获得静态成员。。 * 但是 我会想 那在反序列化之后 * 应该是恢复原来的默认的值的啊  也就是 A的值应该是0 而不是上面的10 *  * 但是  我忽略了一点  就是 这是在同一个类中实现的序列化和返序列化 当序列化时 Person类就 * 被加载进内存,然后 在person类就一直存在啊静态变量也一直存在啊  存在啊 在啊 啊。。。。 不解释了吧? *你妹的Person.getA();这不就一直没变么? *所以除非让Person类滚出内存。。。 *也就是让程序执行两次  将序列化 和反序列化 封装在两个类中 这样 person就两进两出,,, *吼吼 我真是天才 */System.out.println(p);}catch(FileNotFoundException e){e.printStackTrace();}catch (IOException e ){e.printStackTrace();}catch(ClassNotFoundException e){e.printStackTrace();}finally{try{oos.close();ois.close();}catch(IOException e){e.printStackTrace();}}}}


原创粉丝点击