今天在看源码的是否发现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虚拟机是上策。 实现了序列化接口的类,如果其成员不需要序列化进去,则使用transient关键字进行修饰。 下面给出个例子:
Java中的序列化机制有两种实现方式: 一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何...
通过实现 Serializable 接口,Java对象可以被序列化和反序列化。序列化可以将对象转换为字节流,以便于存储或传输。反序列化则可以将字节流重新转换为原始对象。需要注意的是,序列化和反序列化的类必须具有相同的 ...
主要介绍了Java中对象序列化与反序列化,较为详细的分析了java中对象序列化的概念、原理、实现方法及相关注意事项,具有一定参考借鉴价值,需要的朋友可以参考下
对象序列化 串行化 实现java对象的保存
所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象。这个过程也可以通过...像RMI、Socket、JMS、EJB它们中的一种,彼此为什么能够传递Java对象,当然都是对象序列化机制的功劳。
使用 XStream 不用任何映射就能实现多数 Java 对象的序列化。在生成的 XML 中对象名变成了元素名,类中的字符串组成了 XML 中的元素内容。使用 XStream 序列化的类不需要实现 Serializable 接口。XStream 是一种序列...
序列化是一种对象持久化的手段。... Java对象的序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比
5.2.4 对象实现机制 为了方便开发人员将Java对象进行序列化及反序列化,Java提供了一套方便的API来支持。其中包括以下接口和类: java.io.Serializable java.io.Externalizable ObjectOutput ObjectInput ...
java序列化反序列化 可以将一个对象保存起来哦,哈哈,很实用,别忘了实现序列化接口
影院管理系统!主要包含了反射和序列化等知识的应用,对对象的序列化
意义:序列化机制允许将实现序列化的Java对象转换为字节序列,并将字节序列保存在磁盘中,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使地对象可以脱离程序的运行而独立存在。 使用场景:所有在网络上...
主要给大家介绍了关于java中对象的序列化与反序列化的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
1、序列化是干什么的 2、什么情况下需要序列化 3、当对一个对象实现序列化时,究竟发生了什么 4、实现序列化(保存到一个文件)的步骤 5、举例说明 6、相关注意
Java当中提供了一种序列化操作的方式,用一个字节序列来表示一个对象,该字节序列中保存了对象的属性、对象的数据、对象的类型。把字节序列化保存到文件中,就可以做到持久化保存数据内容。 1.2 如何将对象数据序列...
Java中的序列化(serialization)机制能够将一个实例对象的状态信息写入到一个字节流中,使其可以通过socket进行传输、或者持久化存储到数据库或文件系统中;然后在需要的时候,可以根据字节流中的信息来重构一个...
Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM(Java Virtual Machine(Java虚拟机))处于运行时,这些对象才可能存在(即,这些对象的生命...Java对象序列化就能够帮助我们实现该功能。
这段代码实现了一个简单的文件备份工具FileBackupTool,其中使用了Java的序列化机制。在类的构造方法中,首先接收两个参数:源文件路径和备份文件路径。然后实现了一个backup()方法,用于将源文件进行备份。在该方法...
序列化与反序列化是指Java对象与字节序列的相互转换,一般在保存或传输字节序列的时候会用到,下面有两个Java实现序列化与反序列化的简单示例,不过还是先来看看序列和反序列化的具体概念: