`
nicegege
  • 浏览: 582461 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java对象实现序列化

阅读更多

今天在看源码的是否发现BaseEntity实现了序列化接口。以前都是模仿别人在实体上实现序列化接口。为了更好的理解序列化的意义,总结java对象序列化。

java对象从内存中写入到磁盘时,经过如下步骤:

(1).声明一个ObjectOutputStream对象,构造ObjectOutputStream对象的时候,传递FileOutputStream对象参数。构造FileOutputStream对象的时候,传递文件或文件路径参数。

(2).构造对象,通过ObjectOutputStream的writeObject方法写入到流中。

import java.util.Date;

public abstract class BaseEntity {
	private String id;
	private Date createTime;
	private Date modifyTime;
	private Date deleteTime;
	private String createUser;
	private String modifyUser;
	private String deleteUser;
	private int deleteFlag = 2;
	private boolean checked = false;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public Date getCreateTime() {
		return createTime;
	}
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
	public Date getModifyTime() {
		return modifyTime;
	}
	public void setModifyTime(Date modifyTime) {
		this.modifyTime = modifyTime;
	}
	public Date getDeleteTime() {
		return deleteTime;
	}
	public void setDeleteTime(Date deleteTime) {
		this.deleteTime = deleteTime;
	}
	public String getCreateUser() {
		return createUser;
	}
	public void setCreateUser(String createUser) {
		this.createUser = createUser;
	}
	public String getModifyUser() {
		return modifyUser;
	}
	public void setModifyUser(String modifyUser) {
		this.modifyUser = modifyUser;
	}
	public String getDeleteUser() {
		return deleteUser;
	}
	public void setDeleteUser(String deleteUser) {
		this.deleteUser = deleteUser;
	}
	public int getDeleteFlag() {
		return deleteFlag;
	}
	public void setDeleteFlag(int deleteFlag) {
		this.deleteFlag = deleteFlag;
	}
	public boolean isChecked() {
		return checked;
	}
	public void setChecked(boolean checked) {
		this.checked = checked;
	}
	
	
}
public class Person extends BaseEntity {
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String toString(){
		return "name:"+this.getName()+
			   "age:"+this.getAge()+
			   "checked:"+this.isChecked()+
			   "createTime:"+this.getCreateTime();
	}
	
}

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Date;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//序列化
		Person p1=new Person();
		p1.setAge(1);
		p1.setChecked(true);
		p1.setCreateTime(new Date());
		p1.setName("liming");
		FileOutputStream fos=null;
		ObjectOutputStream oos=null;
		try {
			fos=new FileOutputStream("person1.txt");
			oos=new ObjectOutputStream(fos);
			oos.writeObject(p1);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			if(oos!=null){
				try {
					oos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(fos!=null){
				try {
					fos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

	}

}

 运行结果为:

java.io.NotSerializableException: net.chinaedu.projects.g3mini.Person

at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)

at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)

at net.chinaedu.projects.g3mini.Test.main(Test.java:27)

从报错结果可以分析出ObjectOutputStream.writeObject方法报错。writeObject方法的源码:

 /**
     * Underlying writeObject/writeUnshared implementation.
     */
    private void writeObject0(Object obj, boolean unshared) 
	throws IOException 
    {
	boolean oldMode = bout.setBlockDataMode(false);
	depth++;
	try {
	    // handle previously written and non-replaceable objects
	    int h;
	    if ((obj = subs.lookup(obj)) == null) {
		writeNull();
		return;
	    } else if (!unshared && (h = handles.lookup(obj)) != -1) {
		writeHandle(h);
		return;
	    } else if (obj instanceof Class) {
		writeClass((Class) obj, unshared);
		return;
	    } else if (obj instanceof ObjectStreamClass) {
		writeClassDesc((ObjectStreamClass) obj, unshared);
		return;
	    }
	    
	    // check for replacement object
	    Object orig = obj;
	    Class cl = obj.getClass();
	    ObjectStreamClass desc;
	    for (;;) {
		// REMIND: skip this check for strings/arrays?
		Class repCl;
		desc = ObjectStreamClass.lookup(cl, true);
		if (!desc.hasWriteReplaceMethod() ||
		    (obj = desc.invokeWriteReplace(obj)) == null ||
		    (repCl = obj.getClass()) == cl)
		{
		    break;
		}
		cl = repCl;
	    }
	    if (enableReplace) {
		Object rep = replaceObject(obj);
		if (rep != obj && rep != null) {
		    cl = rep.getClass();
		    desc = ObjectStreamClass.lookup(cl, true);
		}
		obj = rep;
	    }

	    // if object replaced, run through original checks a second time
	    if (obj != orig) {
		subs.assign(orig, obj);
		if (obj == null) {
		    writeNull();
		    return;
		} else if (!unshared && (h = handles.lookup(obj)) != -1) {
		    writeHandle(h);
		    return;
		} else if (obj instanceof Class) {
		    writeClass((Class) obj, unshared);
		    return;
		} else if (obj instanceof ObjectStreamClass) {
		    writeClassDesc((ObjectStreamClass) obj, unshared);
		    return;
		}
	    }

	    // remaining cases
	    if (obj instanceof String) {
		writeString((String) obj, unshared);
	    } else if (cl.isArray()) {
		writeArray(obj, desc, unshared);
	    } else if (obj instanceof Enum) {
		writeEnum((Enum) obj, desc, unshared);
	    } else if (obj instanceof Serializable) {
		writeOrdinaryObject(obj, desc, unshared);
	    } else {
		if (extendedDebugInfo) {
		    throw new NotSerializableException(
			cl.getName() + "\n" + debugInfoStack.toString());
		} else {
		    throw new NotSerializableException(cl.getName());
		}    
	    }
	} finally {
	    depth--;
	    bout.setBlockDataMode(oldMode);
	}
    }

 其中有一段代码是判断obj类型的,如下

if (obj instanceof String) {
		writeString((String) obj, unshared);
	    } else if (cl.isArray()) {
		writeArray(obj, desc, unshared);
	    } else if (obj instanceof Enum) {
		writeEnum((Enum) obj, desc, unshared);
	    } else if (obj instanceof Serializable) {
		writeOrdinaryObject(obj, desc, unshared);
	    } else {
		if (extendedDebugInfo) {
		    throw new NotSerializableException(
			cl.getName() + "\n" + debugInfoStack.toString());
		} else {
		    throw new NotSerializableException(cl.getName());
		}    
	    }

 先判断obj对象是不是String,Array,Enum,以上都不是的时候,判断是不是对象是不是Serializable的实例。不是的话,写入方法内部会throw NotSerializableException。

 

读取反序列化文件:

 

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;

public class ReadPerson1Test {

	/**
	 * 读取序列化的内容
	 */
	public static void main(String[] args) {
		
		FileInputStream fis=null;
		ObjectInputStream ois=null;
		try {
			fis=new FileInputStream("F:/101edu/svn-work/svn-shiyanban/trunk/dev/src/cedu.g3mini/src/main/java/net/chinaedu/projects/g3mini/person1.txt");
			ois=new ObjectInputStream(fis);
			Person p=(Person) ois.readObject();
			System.err.println(p.toString());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

 

 

分享到:
评论

相关推荐

    深入探索Java对象的序列化

    深入探索Java对象的序列化 ...一般来说,没有必要自己实现序列化接口,直接交给Java虚拟机是上策。 实现了序列化接口的类,如果其成员不需要序列化进去,则使用transient关键字进行修饰。 下面给出个例子:

    Java 对象序列化详解以及实例实现和源码下载

    Java中的序列化机制有两种实现方式: 一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何...

    什么是Java的序列化和反序列化?如何实现对象的序列化和反序列化?(java面试题附答案).txt

    通过实现 Serializable 接口,Java对象可以被序列化和反序列化。序列化可以将对象转换为字节流,以便于存储或传输。反序列化则可以将字节流重新转换为原始对象。需要注意的是,序列化和反序列化的类必须具有相同的 ...

    深入理解Java虚拟机-Java内存区域透彻分析(序列化、反序列化概念及其使用场景+实现序列化的方式+transient关键字)

    深入理解Java虚拟机-Java内存区域透彻分析(序列化、反序列化概念及其使用场景+实现序列化的方式+transient关键字) Java序列化和反序列化是Java虚拟机中的一种重要机制,它们可以将Java对象转换为二进制数据,然后...

    Java中对象序列化与反序列化详解

    主要介绍了Java中对象序列化与反序列化,较为详细的分析了java中对象序列化的概念、原理、实现方法及相关注意事项,具有一定参考借鉴价值,需要的朋友可以参考下

    对象序列化 串行化

    对象序列化 串行化 实现java对象的保存

    Java对象序列化使用基础

    所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象。这个过程也可以通过...像RMI、Socket、JMS、EJB它们中的一种,彼此为什么能够传递Java对象,当然都是对象序列化机制的功劳。

    XStream <--> Java 对象序列化为 XML 互换

    使用 XStream 不用任何映射就能实现多数 Java 对象的序列化。在生成的 XML 中对象名变成了元素名,类中的字符串组成了 XML 中的元素内容。使用 XStream 序列化的类不需要实现 Serializable 接口。XStream 是一种序列...

    什么是java序列化,如何实现java序列化?学习.pdf

    Java 序列化机制 Java 序列化机制是一种将对象状态写入 Byte 流里的技术...Java 序列化机制是一种强大的技术,可以帮助开发者快速实现对象的持久化和传播。但是,需要注意父类的处理和构造函数的调用,以免出现错误。

    深入分析Java的序列化与反序列化

    序列化是一种对象持久化的手段。...  Java对象的序列化  Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比

    什么是java序列化,如何实现java序列化?.pdf

    Java 序列化是将一个对象的状态写入一个 Byte 流里,并且可以从其它地方把该 Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到数据库、文件等系统...

    Java高级程序设计实战教程第五章-Java序列化机制.pptx

    5.2.4 对象实现机制 为了方便开发人员将Java对象进行序列化及反序列化,Java提供了一套方便的API来支持。其中包括以下接口和类: java.io.Serializable java.io.Externalizable ObjectOutput ObjectInput ...

    什么是java序列化,如何实现java序列化?借鉴.pdf

    Java 序列化是指将一个对象的状态写入一个 Byte 流里,并且可以从其它地方把该 Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到数据库、文件等...

    java序列化反序列化

    java序列化反序列化 可以将一个对象保存起来哦,哈哈,很实用,别忘了实现序列化接口

    影院管理系统(序列化)

    影院管理系统!主要包含了反射和序列化等知识的应用,对对象的序列化

    java序列化和反序列化,面试必备

    意义:序列化机制允许将实现序列化的Java对象转换为字节序列,并将字节序列保存在磁盘中,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使地对象可以脱离程序的运行而独立存在。 使用场景:所有在网络上...

    java中对象的序列化与反序列化深入讲解

    主要给大家介绍了关于java中对象的序列化与反序列化的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Java反序列化回显解决方案.docx

    Java反序列化回显解决方案 Java反序列化回显解决方案是指在Java中,使用反序列化来执行命令,导致RCE(Remote Code Execution)的解决方案。该解决方案主要涉及到Java的反序列化机制和ClassLoader的使用。 首先,...

    对象的序列化和反序列化1

    1、序列化是干什么的 2、什么情况下需要序列化 3、当对一个对象实现序列化时,究竟发生了什么 4、实现序列化(保存到一个文件)的步骤 5、举例说明 6、相关注意

Global site tag (gtag.js) - Google Analytics