java序列化封装
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class Serializer { static public void serializeObject(Object obj,String path) throws IOException { FileOutputStream fos = new FileOutputStream(path); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(obj); oos.flush(); oos.close(); } //java貌似没有引用的引用,只好返回了 static public Object reSerializeObject(String path) throws ClassNotFoundException, IOException { FileInputStream fis = new FileInputStream(path); ObjectInputStream oin = new ObjectInputStream(fis); return oin.readObject(); //会申请新的空间 } }
上面提到,java没有引用的引用。
反序列化代码,其实之前我是这样子写的。
private void reSerializeObject(Object obj,String path) throws ClassNotFoundException, IOException { FileInputStream fis = new FileInputStream(path); ObjectInputStream oin = new ObjectInputStream(fis); obj = oin.readObject(); //会申请新的空间 }
调用是这样子的
public void test3() throws IOException, ClassNotFoundException { node node1 = new node(1); serializeObject(node1,"node1.obj"); node1.id = 9; node node2 = new node(0); reSerializeObject(node2,"node1.obj"); System.out.println(node2.id); }
发现通过函数reSerializeObject是不会改变传进来的实参node2的。
本质上在于,
函数传参时,
形参obj跟node2指向同一个对象(同一块内存),
当语句obj = oin.readObject();执行后,
obj指向了另一个对象(另一块内存),
而node2还是指向原来的对象。
在c++中,可以通过两层的引用或者指针,实现我的想法的。
但java貌似只有一层的引用。
于是乎,
我直接用返回值的形式实现了我的想法。
本文作者: linger
本文链接:http://blog.csdn.net/lingerlanlan/article/details/38118919