javaIO 序列化和反序列化
来源:互联网 发布:淘宝企业店铺审核时间 编辑:程序博客网 时间:2024/06/15 17:19
3.对象的序列化,反序列化
1)对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化
2)序列化流(ObjectOutputStream),是过滤流----writeObject
反序列化流(ObjectInputStream)---readObject
3)序列化接口(Serializable)
对象必须实现序列化接口 ,才能进行序列化,否则将出现异常
这个接口,没有任何方法,只是一个标准
4) transient关键字
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException
分析ArrayList源码中序列化和反序列化的问题
如果变量被transient关键字修饰 和static修饰是不会被自动序列化的 需要手动操作:
===============================================================================
1)对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化
2)序列化流(ObjectOutputStream),是过滤流----writeObject
反序列化流(ObjectInputStream)---readObject
3)序列化接口(Serializable)
对象必须实现序列化接口 ,才能进行序列化,否则将出现异常
这个接口,没有任何方法,只是一个标准
4) transient关键字
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException
分析ArrayList源码中序列化和反序列化的问题
5)序列化中 子类和父类构造函数的调用问题
对子类对象进行反序列化操作时,如果一个父类没有实现Serializable接口就会调用父类的默认构造器
如果父类实现了Serializable接口子类也可以进行序列化操作
================================================
测试类:
public class SerDemo {/** * 3.对象的序列化,反序列化 1)对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化 * 2)序列化流(ObjectOutputStream),是过滤流----writeObject * 反序列化流(ObjectInputStream)---readObject * * 3)序列化接口(Serializable) 对象必须实现序列化接口 ,才能进行序列化,否则将出现异常 这个接口,没有任何方法,只是一个标准 * * @param args * @throws FileNotFoundException * @throws IOException * @throws ClassNotFoundException * @throws Exception */// 对象序列化public void ObjectOutputStream1(String pathname)throws FileNotFoundException, IOException {ObjectOutputStream oso = new ObjectOutputStream(new FileOutputStream(pathname));Good g = new Good("这个杀手不怕冷", 300000000, "你想要什么?");oso.writeObject(g);oso.flush();oso.close();}// 对象反序列化public void ObjectInputStream1(String st) throws IOException, Exception {ObjectInputStream ois = new ObjectInputStream(new FileInputStream(st));Good b = (Good) ois.readObject();System.out.println(b);ois.close();}public static void main(String[] args) throws Exception {// TODO Auto-generated method stubString s = "demo\\ser.dat";SerDemo ser = new SerDemo();// ser.ObjectOutputStream1(s);// ser.ObjectInputStream1(s);}实体类:
public class Good implements Serializable { private String name; private int age; private String description; public Good(){ }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 String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public Good(String name, int age, String description) {super();this.name = name;this.age = age;this.description = description;}@Overridepublic String toString() {return "Good [name=" + name + ", age=" + age + ", description="+ description + "]";} }
如果变量被transient关键字修饰 和static修饰是不会被自动序列化的 需要手动操作:
如何实现手动操作 需要在实体类覆盖ArrayList的
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException
---------------------------------------------------------------------------------------------------------------
实体类:
package Serializable2;import java.io.Serializable;public class Student implements Serializable { private String name; private transient String description; private transient int age; public Student(){ }public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student [name=" + name + ", description=" + description + ", age="+ age + "]";}public Student(String name, String description, int age) {super();this.name = name;this.description = description;this.age = age;}private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{s.defaultWriteObject();int a=description.length();s.writeInt(a);for(int i=0;i<a;i++){s.writeChar(description.charAt(i));}s.writeInt(age);}private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException{ s.defaultReadObject();// int b=description.length();//错误 还没读取jvm怎么知道description.length()是什么东西 int b=s.readInt(); char [] c=new char[b]; for(int i=0;i<b;i++){ c[i]=s.readChar(); this.description=new String(c,0,b);} this.age=s.readInt();} }测试类与上面无异:
package Serializable2;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;public class SerDemo3 {/**transient关键字 变量就不再进行jvm的默认的序列化操作 但是可以自己进行序列化操作 * @param args * @throws Exception *///对象序列化public void ObjectOutputStream1(String pathname) throws FileNotFoundException, IOException{ ObjectOutputStream oso=new ObjectOutputStream( new FileOutputStream (pathname)); Student g=new Student("这个杀手很怕冷","怕是不冷喔",18); oso.writeObject(g); oso.flush(); oso.close();}//对象反序列化public void ObjectInputStream1(String st) throws IOException, Exception{ObjectInputStream ois = new ObjectInputStream(new FileInputStream(st));Student b = (Student) ois.readObject();System.out.println(b);ois.close();}public static void main(String[] args) throws Exception {String s="demo\\ser3.dat";SerDemo3 ser3=new SerDemo3();ser3.ObjectOutputStream1(s); ser3.ObjectInputStream1(s);}}
===============================================================================
找到的对象序列化好文章:http://www.cnblogs.com/lanxuezaipiao/p/3369962.html
public class ObjectSeriaDemo2 {public static void main(String[] args) throws Exception{/*ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("demo/obj1.dat"));Foo2 foo2 = new Foo2();oos.writeObject(foo2);oos.flush();oos.close();*///反序列化是否递归调用父类的构造函数/*ObjectInputStream ois = new ObjectInputStream(new FileInputStream("demo/obj1.dat"));Foo2 foo2 = (Foo2)ois.readObject();System.out.println(foo2);ois.close();*//*ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("demo/obj1.dat"));Bar2 bar2 = new Bar2();oos.writeObject(bar2);oos.flush();oos.close();*/ObjectInputStream ois = new ObjectInputStream(new FileInputStream("demo/obj1.dat"));Bar2 bar2 = (Bar2)ois.readObject();System.out.println(bar2);ois.close();/* * 对子类对象进行反序列化操作时, * 如果其父类没有实现序列化接口 * 那么其父类的构造函数会被调用 */}}/* * 一个类实现了序列化接口,那么其子类都可以进行序列化 */class Foo implements Serializable{public Foo(){System.out.println("foo...");}}class Foo1 extends Foo{public Foo1(){System.out.println("foo1...");}}class Foo2 extends Foo1{public Foo2(){System.out.println("foo2...");}}class Bar{public Bar(){System.out.println("bar");}}class Bar1 extends Bar{public Bar1(){System.out.println("bar1..");}}class Bar2 extends Bar1 implements Serializable{public Bar2(){System.out.println("bar2...");}}
0 0
- javaIO 序列化和反序列化
- 序列和反序列化
- 序列和反序列化
- 序列化和反序列化
- 序列化和反序列化
- 序列化和反序列化
- c# 序列化和反序列化
- .NET序列化和反序列化
- .net序列化和反序列化
- 序列化和反序列化
- C#序列化和反序列化
- XML序列化和反序列化
- Serializable,序列化和反序列化
- C#序列化和反序列化
- Java序列化和反序列化
- C#序列化和反序列化
- 序列化和反序列化
- c#序列化和反序列化
- nginx代理websocket,出现websocket 1006 (abnormal closure)错误
- meta功能总结
- poj2752_Seek the Name,Seek the Fame_KMP(next数组定义的应用)
- 5分钟做出简单makefile(linux)
- 使用List集合写的一个简单的学生信息管理系统!
- javaIO 序列化和反序列化
- python 动态增加logger handler
- Java注释与规范、javadoc命令生成帮助手册
- 排序、子查询
- 2017/04/20
- SpringMVC的freemarker支持(页面静态话)
- xgboost入门与实战(实战调参篇)
- 查询语句
- 普通树的广度搜索和深度搜索java实现