字符输出流与序列化( 四 )


思考问题2:
一台服务器内存中的数据只能被当前1号服务器读取, 如果别的服务器也希望拿到这个数据呢?(比如分布式系统中)
解决方法:
可以将1号服务器中的Java对象通过序列化转成二进制流数据, 再通过网络传输到2号服务器中, 二号服务器接收到这些二进制数据后, 再通过反序列化将二进制数据转成内存中的Java对象即可!
4.序列化和反序列化的特点
如果一个对象需要序列化,该对象所属的类必须实现接口才可以被序列化
如果要进行序列化的对象所属的类没有实现该接口, 在进行序列化时, 将会抛出tion异常
Student stu = new Student( "张三", 22 );class Student extends... implements Serializable{ ... }
5.
将 Java 对象的基本数据类型和图形写入。可以使用 读取(重构)对象 。通过在流中使用文件可以实现对象的持久存储
ObjectOutputStream(OutputStream out) 创建写入指定 OutputStream 的 ObjectOutputStream 。void writeObject(Object obj) 将指定的对象写入 ObjectOutputStream
测试对Java对象进行序列化:
/** 测试使用ObjectOutputStream将Java对象序列化到磁盘的文件中* 1) 定义学生类, 添加成员变量和成员方法(get,set),构造方法* 2) 创建ObjectOutputStream流对象, 创建学生类的对象* 3) 将学生对象转成字节序列(序列化)到磁盘文件中*/public class SerializableDemo {public static void main(String[] args) {try {// 1.创建ObjectOutputStream流对象, 用于序列化Java对象// 创建FileOutputStream流对象,将Java对象输出到指定的文件中FileOutputStream out = new FileOutputStream( "d:/iotest/ser/student.ser" );ObjectOutputStream objOut = new ObjectOutputStream( out );// 2.创建学生对象,将学生对象转成字节序列(序列化)到磁盘文件中Student stu = new Student( "张飞", 20 );objOut.writeObject( stu );// 3.关闭流(释放资源)objOut.close();System.out.println( "对象序列化成功!" );} catch (Exception e) {System.out.println( "对象序列化失败!" );e.printStackTrace();}}}/** 定义学生类*/class Student implements Serializable{//成员变量private String name;private int age;//构造方法public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}//get和set方法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;}}
6.
对以前使用写入的基本数据和对象进行反序列化 。
,用于读取序列化后的字节序列,将这些字节序列重新转换为Java对象
ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream 。Object readObject() 从 ObjectInputStream 读取对象,读取序列化数据
测试对Java对象进行反序列化
/** 测试使用ObjectInputStream将序列化后磁盘文件转成内存中的Java对象* 1) 创建ObjectInputStream流对象* 2) 将序列化后的磁盘文件转成Java对象* 3) 测试Java对象*/public class SerializableDemo2 {public static void main(String[] args) {try {//1.创建ObjectInputStream流对象, 用于反序列化//创建FileInputStream流对象,用于反序列化(读取)指定文件中的内容FileInputStream in = new FileInputStream( "d:/iotest/ser/Student.ser" );ObjectInputStream objIn = new ObjectInputStream( in );// 2.将序列化后的磁盘文件转成Java对象Object obj = objIn.readObject();// 3.测试Java对象System.out.println( obj ); //cn.tedu.serializable.Student@b684286// 向下转型为Student类型Student stu = (Student)obj;System.out.println( stu.getName()+", "+stu.getAge() );} catch (Exception e) {e.printStackTrace();}}}