Java对象序列化与反序列化
有什么用?
序列化一个对象与反序列化对象可能只在java语言中能用到,如果想把对象的状态保存,别的语言是无法识别,也就是没有对其反顺序列化。因此要想跨语言,最好用别的格式来保存,比如xml,txt等。
序列化能保存对象的哪些状态?
只能保存对象的属性的值,方法是没法保存的,因为方法是属性类的,而属性的的值是属性对象的。
怎么样序列化一个对象?
1、创建一个FileOutputStream fileStream = new FileOutputStream(“filename”);
如果文件名不存在,他会自动创建的。
2、创建一个ObjectOutStream对象ObjectOutStream os = new ObjectOutStream(fileStream);
3、把你的对象添加到ObjectOutStream对象中,如 os.wirteObject(MyObject);
4、一定要记得关闭输出流 os.close();
如果要序列化的对象引用了别的对象,别的对象也引用了对象,那么这些对象都会被序例化,也就是一种递归的序列过程。
什么样的类可以序列化?
实现了Serializable接口的类是可以序列化的。
如果在要序列化的类中有不能序列化的引用对象,那么会引发异常
如java.io.NotSerializableException
import java.io.*; public class Pond implements Serializable { private Duck duck = new Duck(); public static void main(Strin args) { Pond myPond = new Pond(); try { FileOutputStream fs = FileOutputStream(“pond.ser”); ObjectOutputStream os = new ObjectOutputStream(fs); os.writeObject(myPond); os.close(); } catch(Exception ex) { ex.printStackTrace(); } } } public class Duck { //代码….. }
去除不想序列化的变量?
加上translent
如translent String name; name变量不会被序列化。
反序列化
1、 FileInputStream fileStream = new FileInputStream(“filename”);
2、 ObjectInputStream os = new ObjectInputStream(fileStream);
3、 Object one = os.redobject();
4、 Os.close();