天天看点

java序列化封装

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