1、序列化是干什么的?
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。
只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。
2、什么情况下需要序列化
3、当对一个对象实现序列化时,究竟发生了什么?
java 代码
Foo
myFoo .setWidth(37);
myFoo.setHeight(70);
序列化的API
java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。只有实现了Serializable和Externalizable接口的类的对象才能被序列化。
java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
java 代码
FileOutputStream fs = new FileOutputStream("foo.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(myFoo);
4、实现序列化(保存到一个文件)的步骤
java 代码
FileOutputStream fs = new FileOutputStream("foo.ser");
java 代码
ObjectOutputStream os =
java 代码
os.writeObject(myObject1);
os.writeObject(myObject2);
os.writeObject(myObject3);
java 代码
os.close();
5、举例说明
- package
com.hotye.dchaoxiong.serializabletest; -
- import
java.io.FileInputStream; - import
java.io.FileOutputStream; - import
java.io.ObjectInputStream; - import
java.io.ObjectOutputStream; - import
java.io.Serializable; -
- public
class Box implements Serializable { -
-
private static final long serialVersionUID = 1L; -
private int width; -
private int height; -
private String name; -
-
public static void main(String[] args) { -
-
try { -
Box myBox = new Box(); -
myBox.setWidth(50); -
myBox.setHeight(30); -
myBox.setName("芒果"); -
-
FileOutputStream fs = new FileOutputStream("serializableObject.txt"); -
ObjectOutputStream os = new ObjectOutputStream(fs); -
os.writeObject(myBox); -
os.close(); -
fs.close(); -
} catch (Exception ex) { -
ex.printStackTrace(); -
} -
-
try { -
FileInputStream fis = new FileInputStream("serializableObject.txt"); -
ObjectInputStream ois = new ObjectInputStream(fis); -
Box box = (Box) ois.readObject(); -
System.out.println(box.getWidth()); -
System.out.println(box.getHeight()); -
System.out.println(box.getName()); -
ois.close(); -
fis.close(); -
} catch (Exception e) { -
e.printStackTrace(); -
} -
} -
-
public void setHeight(int height) { -
this.height = height; -
} -
-
public int getHeight() { -
return height; -
} -
-
public void setWidth(int width) { -
this.width = width; -
} -
-
public int getWidth() { -
return width; -
} -
-
public void setName(String name) { -
this.name = name; -
} -
-
public String getName() { -
return name; -
} -
- }
读取对象的顺序与写入时的顺序要一致。
6、相关注意事项