- 浏览: 76458 次
- 性别:
- 来自: 广州
文章分类
最新评论
ObjectOutputStream和ObjectInputStream类所读写的对象必须实现了Serializable的接口,对象中的transient和static类型的成员变量不会被读取和写入.
下面是UML图
下面是代码例子1
当在继承的时候,超类如果不是可序列化,那么超类一定要有一个无参数的构造函数,以便允许初始化其字段。在此情况下,子类负责保存和恢复不可序列化的类的状态。不然会抛出这个异常java.io.InvalidClassException
下面会出现异常的版本
提供无参数构造函数的版本
下面是UML图
下面是代码例子1
import java.io.File; 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; import java.util.List; public class ObjectputStreamTest { private static File getFile() { return new File(System.getProperty("user.dir")+"/student.txt"); } /** * 读取文档数据 * @return */ @SuppressWarnings("unchecked") private static List<Student> getStudents() { File file = getFile(); List<Student> list = null; FileInputStream fis = null; ObjectInputStream ois = null; try { fis = new FileInputStream(file); if(fis.available()!=-1) { ois = new ObjectInputStream(fis); Object obj = ois.readObject(); list = (ArrayList<Student>)obj; }else { list = new ArrayList<Student>(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }catch (ClassNotFoundException e) { e.printStackTrace(); }finally { try { fis.close(); ois.close(); } catch (IOException e) { e.printStackTrace(); } fis = null; ois=null; } return list; } /** * 更改数据 * @param list */ private static void setStudents(List<Student> list) { File file = getFile(); FileOutputStream fos =null; ObjectOutputStream oos=null; try { fos = new FileOutputStream(file); oos = new ObjectOutputStream(fos); oos.writeObject(list); oos.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { fos.close(); oos.close(); } catch (IOException e) { e.printStackTrace(); } fos=null; oos=null; } } /** * 插入数据 * @param stu */ public static void insert(Student stu) { List<Student> list = getStudents(); list.add(stu); setStudents(list); } /** * 更新数据 * @param i * @param stu */ public static void update(int i,Student stu) { List<Student> list = getStudents(); list.remove(i); list.add(i,stu); setStudents(list); } /** * 删除数据 * @param i */ public static void delete(int i) { List<Student> list = getStudents(); list.remove(i); setStudents(list); } @SuppressWarnings("static-access") public static void print(List<Student> list) { for (Iterator<Student> iterator = list.iterator(); iterator.hasNext();) { Student student = (Student) iterator.next(); System.out.print("id="+student.getId()+",name="+student.getName()+",count="+student.getCount()+",sex="+student.getSex()+",serialVersionUID="+student.getSerialVersionUID()); System.out.println(); } } public static void main(String[] args) { List<Student> list = new ArrayList<Student>(); Student stu = new Student(); stu.setName("chendingqiang"); stu.setSex("男"); list.add(stu); stu = new Student(); stu.setName("limoumou"); list.add(stu); ObjectputStreamTest.setStudents(list); list = ObjectputStreamTest.getStudents(); print(list); System.out.println("=================================="); //修改 stu = new Student(); stu.setName("陈顶强"); ObjectputStreamTest.update(0, stu); list = ObjectputStreamTest.getStudents(); print(list); //删除 System.out.println("=================================="); ObjectputStreamTest.delete(0); list = ObjectputStreamTest.getStudents(); print(list); //插入 System.out.println("=================================="); stu = new Student(); stu.setName("zhumoumou"); ObjectputStreamTest.insert(stu); list = ObjectputStreamTest.getStudents(); print(list); } } class Student implements Serializable { private static final long serialVersionUID = 1L; private transient String sex;//瞬态不能序列化 private int id; private String name; private static int count=1; 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 Student() { id=count; count++; } @Override public boolean equals(Object obj) { if(obj instanceof Student) { Student stu = (Student)obj; if(this.id == stu.id) { return true; } } return false; } public static int getCount() { return count; } public static void setCount(int count) { Student.count = count; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public static long getSerialVersionUID() { return serialVersionUID; } }
当在继承的时候,超类如果不是可序列化,那么超类一定要有一个无参数的构造函数,以便允许初始化其字段。在此情况下,子类负责保存和恢复不可序列化的类的状态。不然会抛出这个异常java.io.InvalidClassException
下面会出现异常的版本
public class Shape { private int diameter; public int getDiameter() { return diameter; } public void setDiameter(int diameter) { this.diameter = diameter; } /** * 不提供无参数构造函数 * @param diameter */ public Shape(int diameter) { this.diameter = diameter; } } import java.io.Serializable; @SuppressWarnings("serial") public class Circle extends Shape implements Serializable { private int r; public Circle(int diameter,int r) { super(diameter); this.r = r; } public int getR() { return r; } public void setR(int r) { this.r = r; } } import java.io.File; 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 ExtendObjecTest { public static void main(String[] args) { File file = new File(System.getProperty("user.dir")+"/student.txt"); Circle c = new Circle(12,32); FileOutputStream fos =null; ObjectOutputStream oos=null; try { fos = new FileOutputStream(file); oos = new ObjectOutputStream(fos); oos.writeObject(c); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { fos.close(); oos.close(); } catch (IOException e) { e.printStackTrace(); } fos=null; oos=null; } FileInputStream fis = null; ObjectInputStream ois = null; try { fis = new FileInputStream(file); ois = new ObjectInputStream(fis); Circle result = (Circle)ois.readObject(); System.out.println("diameter:"+result.getDiameter()+",r:"+result.getR()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
提供无参数构造函数的版本
public class Shape { private int diameter; public int getDiameter() { return diameter; } public void setDiameter(int diameter) { this.diameter = diameter; } /** * 提供无参数构造函数 * @param diameter */ public Shape() { } } @SuppressWarnings("serial") public class Circle extends Shape implements Serializable { private int r; public Circle(int r) { this.r = r; } public int getR() { return r; } public void setR(int r) { this.r = r; } } import java.io.File; 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 ExtendObjecTest { public static void main(String[] args) { File file = new File(System.getProperty("user.dir")+"/student.txt"); Circle c = new Circle(32); c.setDiameter(23); FileOutputStream fos =null; ObjectOutputStream oos=null; try { fos = new FileOutputStream(file); oos = new ObjectOutputStream(fos); oos.writeObject(c); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { fos.close(); oos.close(); } catch (IOException e) { e.printStackTrace(); } fos=null; oos=null; } FileInputStream fis = null; ObjectInputStream ois = null; try { fis = new FileInputStream(file); ois = new ObjectInputStream(fis); Circle result = (Circle)ois.readObject(); System.out.println("diameter:"+result.getDiameter()+",r:"+result.getR()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
发表评论
-
java io字符读写
2010-12-15 13:05 695... -
RandomAccessFile类学习
2010-12-15 11:59 970在正式介绍如何使用Java的输入/输出相关类来进行文件存取前, ... -
比较java.io.Externalizable和java.io.Serializable
2010-12-15 10:52 868转http://soft.zdnet.com.cn/softw ... -
SequenceInputStream(顺序输入流)学习
2010-12-14 17:56 890转http://imain.iteye.com/blog/26 ... -
PipedInputStream与PipedOutputStream类
2010-12-14 17:39 1200转http://tzj163.blog.163.com/blo ... -
java io学习
2010-12-14 13:58 772下图是java.io输入流的uml图 InputStrea ... -
java rmi学习
2010-12-06 10:01 743转载http://blog.sina.com.cn/s/blo ... -
理解JAVA事件机制
2010-12-05 13:53 773转载http://ajava.org/course/java/ ... -
Java Proxy代理学习
2010-12-05 11:36 911在Java中利用代理(Proxy)可以在运行时创建一个实现了一 ... -
java.util.log学习
2010-12-03 17:14 1431今天学习java.util.logging类包方便以后查看。 ...
相关推荐
在Java中,ObjectOutputStream和ObjectInputStream是两个非常重要的类,分别用于序列化和反序列化。ObjectOutputStream将Java对象转换为字节流,而ObjectInputStream则将字节流恢复为Java对象。 下面是一个简单的...
通过学习和实践`ObjectInputStream`,开发者可以有效地在内存、磁盘或网络之间传递Java对象,增强了程序的灵活性和可移植性。不过,同时也需要注意安全性和版本兼容性问题。在实际开发中,理解并掌握这些知识点是至...
我自己写的一些关于IO中的见解,可以用来参考。 File的增、删、改、查,FileReader和FileWriter类,BufferedReader和BufferedWriter类,ObjectOutputStream和ObjectInputStream类
在Java编程中,Socket和ObjectOutputStream是两个非常重要的概念,它们是进行网络通信的基础。Socket是TCP/IP协议的实现,提供了两台计算机之间双向、独立的数据传输通道。而ObjectOutputStream则是一个序列化流,...
我们使用 FileOutputStream 和 FileInputStream 来读写文件,然后使用 ObjectOutputStream 和 ObjectInputStream 来将对象写入到文件中或从文件中读取对象。 实验目的: 1. 掌握对象串行化的概念和作用 2. 掌握...
在 Java 中,`ObjectInputStream` 和 `ObjectOutputStream` 是两个非常重要的类,它们分别用于实现对象的反序列化和序列化。序列化是将对象的状态转换为字节流的过程,以便可以存储在磁盘上或通过网络传输。反序列化...
在Java I/O体系中,ObjectInputStream和ObjectOutputStream是两个关键类,它们提供了序列化和反序列化的功能,使得Java对象可以被写入到流中(例如磁盘或网络)并在之后重新读取。而FileInputStream则用于处理二进制...
3. Java 对象序列化的使用,包括实现 Serializable 接口和使用 ObjectOutputStream 和 ObjectInputStream 类。 4. 文件输入/输出操作,包括使用 File、FileInputStream 和 FileOutputStream 类。 5.Hashtable 的使用...
使用流套接字建立客户机 运用ObjectOutputStream,ObjectInputStream,ServerSocket,Socket;
该机制通过使用ObjectOutputStream和ObjectInputStream两个类来实现对象的序列化和反序列化。 在Java对象流实例代码中,主要使用了ObjectOutputStream和ObjectInputStream两个类。ObjectOutputStream用于将对象写入...
4. **数据流和对象流**:数据流(如`DataOutputStream`和`DataInputStream`)通常用于处理基本数据类型,而对象流(`ObjectOutputStream`和`ObjectInputStream`)则专门处理Java对象。 5. **缓冲流...
Java提供了ObjectOutputStream和ObjectInputStream类来进行对象的序列化和反序列化操作。 **实验过程及算法** 1. **设计学生类接口**:定义接口,包含添加成绩、查询成绩、显示排名等方法。 2. **实现集合操作**:...
我们使用了ObjectOutputStream和ObjectInputStream类来实现对象的序列化和反序列化。 知识点10:Java开发实践 在这个实例中,我们使用了Java开发实践来实现财务管理系统。我们遵循了Java开发的最佳实践,使用了...
通过这个实验,学生将学习如何使用 Java 语言进行文件输入输出操作,掌握 ObjectInputStream 和 ObjectOutputStream 两个类的使用方法,并了解如何将数据写入磁盘文件中。 一、实验目的 本次实验的目的是通过对 ...
ObjectOutputStream和ObjectInputStream类允许我们将Java对象转换为字节流,通过网络传输,然后在另一端恢复为原来的对象。这对于传递复杂的数据结构,如用户信息、订单等,非常实用。 论文中可能还涉及了异常处理...
“序列化Demo”的内容可能包括了如何创建可序列化的Java类,如何使用ObjectOutputStream和ObjectInputStream进行序列化和反序列化操作,以及如何处理序列化过程中可能出现的问题,如版本控制和安全性。同时,IPCDemo...
ObjectOutputStream和ObjectInputStream类分别用于对象的序列化和反序列化。 5. **用户界面设计**:尽管这是一个简化版的QQ,但仍需有基本的用户交互界面。这可能涉及到Java Swing或JavaFX库,用于创建窗口、按钮、...
Java提供了ObjectOutputStream和ObjectInputStream类用于对象的序列化和反序列化,这样可以将聊天消息转化为字节流在网络上传输,到达目的地后再还原为原始对象。 代码的可维护性和优化也是重要的一环。如果部分...
3. **数据序列化**:Java的ObjectOutputStream和ObjectInputStream类用于序列化和反序列化对象,使得可以将聊天消息(可能是自定义的对象)通过网络传输。 4. **图形用户界面(GUI)**:Java提供了Swing和JavaFX等...
Java提供标准的序列化API,主要包括java.io.Serializable接口和ObjectOutputStream及ObjectInputStream类。 使用序列化,我们可以持久化对象的状态,即使程序关闭后,再次运行时也能恢复之前的对象状态。例如,在...