黑马程序员技术交流社区

标题: 对象的序列化问题 [打印本页]

作者: 李建锋    时间: 2012-6-18 10:31
标题: 对象的序列化问题
如何按照指定的格式对一个对象的字段进行序列化??
作者: sbeeqnui1987    时间: 2012-6-18 10:47
首先,将要序列化的对象实现Serializable接口,Serializable接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的.

然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。


我们有时候将一个java 对象变成字节流的形式传出去或者从一个字节流中恢复成一个java 对象

例如,要将java 对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java 对象变成某个格式的字节流再传输,但是,jre 本身就提供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java帮我们做,要被传输的对象必须实现serializable 接口,这样,javac 编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。需要被序列化的类必须实现Serializable 接口,该接口是一个mini 接口,其中没有需要实现的方法.

implements Serializable只是为了标注该对象是可被序列化的。
例如,在web 开发中,如果对象被保存在了Session 中,tomcat 在重启时要把Session对象序列化到硬盘,这个对象就必须实现Serializable接口。如果对象要经过分布式系统进行网络传输或通过rmi 等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现Serializable接口。
               
作者: 刘笑    时间: 2012-6-18 10:48
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
至于楼主说的按照指定的格式,不明白是什么意思
作者: 曾祥彬    时间: 2012-6-18 11:45
根据楼主的意思,你是不是想自己是想对象的序列化操作而不是使用系统默认的实现方式?
首先,这本身就是一个挑战,java本身对对象序列化的实现方式是没有对外提供的,也就是说是保密的!!!
从这点上来说实现起来应该不简单吧!!!
至于使用java自带的序列化方式,楼上的几位说的也很清楚了啊
1、将要序列化的类实现Serializable接口
2、构造ObjectOutputStream输出流对象,使用ObjectOutputStream的writeObject(Object obj)就可以讲对象序列化到磁盘上面。
3、反序列化就是要构造ObjectInputStream输入流对象了,具体你可以查看JDK的文档

最后一点:学会查文档才是编程的第一要素!!!重中之重啊!!!
作者: 李建锋    时间: 2012-6-18 18:35
把对象按这种格式进行序列化,以下的代码不知到哪里有不对的地方??

目标格式为::
姓名: 科目一 科目二 科目三
张三       34   45   89
李四       89   06   90


对象实体已经定义好了!
package cn.itcast.heima;
import java.io.IOException;
import java.io.ObjectStreamException;
import java.io.Serializable;
public class Student implements Serializable {
/**
  *
  */
private static final long serialVersionUID = 1L;
private String name;
private int subject1;
private int subject2;
private int subject3;
public Student(String name) {
  super();
  this.name = name;
}
private int total;
public String getName() {
  return name;
}
public void setName(String name) {
  this.name = name;
}
public int getSubject1() {
  return subject1;
}
public void setSubject1(int subject1) {
  this.subject1 = subject1;
}
public int getSubject2() {
  return subject2;
}
public void setSubject2(int subject2) {
  this.subject2 = subject2;
}
public int getSubject3() {
  return subject3;
}
public void setSubject3(int subject3) {
  this.subject3 = subject3;
}
public int getTotal() {
  total = subject1 + subject2 + subject3;
  return total;
}
private void readObject(java.io.ObjectInputStream stream)
   throws IOException, ClassNotFoundException {
  System.out.println("我被调用了");
}
private void writeObject(java.io.ObjectOutputStream stream)
   throws IOException {
  System.out.println("我被调用了");
  String info = name + "   " + subject1 + "   " + subject3 + "   "
    + subject2 + "   " + total;
  
  stream.writeChars(info);
  stream.flush();
}
@SuppressWarnings("unused")
private void readObjectNoData() throws ObjectStreamException {
}

}





以下是调用代码!
package cn.itcast.heima;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class Demo3 {
public static void main(String[] args) throws IOException {
  
  String path=Demo3.class
    .getClassLoader().getResource("stu.txt").getPath().substring(0, Demo3.class
    .getClassLoader().getResource("stu.txt").getPath().lastIndexOf("/")-3)+"src/stu.txt";
  
  
  System.out.println(path);
  FileOutputStream fos = new FileOutputStream(path);
  ObjectOutputStream oos = new ObjectOutputStream(fos);
  Student stu = new Student("张三");
  stu.setSubject1(11);
  stu.setSubject2(22);
  stu.setSubject3(33);
  oos.writeObject(stu);
  oos.close();
}
}






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2