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