今天在看源码的是否发现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的IO操作、持久化数据以及实现分布式通信等场景非常关键。 首先,我们来...
2. **接口**: 实现序列化的类需要实现`java.io.Serializable`接口。这个接口是一个标记接口,没有定义任何方法,但是通过实现这个接口,表明类的对象是可以被序列化的。 3. **过程**: - 序列化:使用`java.io....
为了使一个Java对象能够被序列化,该对象所属的类必须实现`java.io.Serializable`接口。大部分JDK内置类如String和Date都已经实现了这个接口。另外,还有`java.io.Externalizable`接口,它继承自`Serializable`,但...
### Java对象序列化标准知识点详解 #### 一、系统架构概览 **1.1 概览** Java 对象序列化是一种将Java对象的状态转换成字节流的过程,以便于在网络上传输或存储到磁盘上。Java序列化标准定义了一套规则来描述如何...
* 使用 Java 序列化 API 实现序列化和反序列化 在实际开发中,选择合适的序列化和反序列化方法取决于具体的需求和场景。在本例中,我们使用 Serializable 接口实现序列化和反序列化,以便在网络上传输 UserMessage ...
Java对象序列化是Java平台的一项重要特性,它允许将对象的状态转换为字节流,以便存储、传输或恢复。在本文中,我们将深入探讨关于Java对象序列化你可能不知道的五件事情,这些知识点对于理解和优化你的Java应用程序...
在Java中,如果一个类想要实现序列化,它必须实现`Serializable`接口。这个接口是一个标记接口,不包含任何方法,它的存在只是为了表明该类的对象是可以被序列化的。例如: ```java public class MyClass ...
3. **实现**:在Java中,一个类如果想要实现序列化,需要实现`java.io.Serializable`接口。这个接口是一个标记接口,没有方法定义,只是表明该类的对象可以被序列化。 4. **序列化API**:主要包括`...
通过实现`java.io.Serializable`接口,一个Java对象可以获得序列化的能力。序列化不仅可以保存对象的状态,还可以在需要时恢复这些状态。 2. **反序列化**: 反序列化是序列化的逆过程,即将字节流还原为原来的Java...
- **实现方式**:要实现序列化,Java对象所属的类必须实现`java.io.Serializable`接口。该接口是一个标记接口,不包含任何方法,只是表明类支持序列化。 - **序列化API**:主要使用`java.io.ObjectOutputStream`类...
Java对象序列化是一种将对象转换为字节流的过程,以便可以将其存储在磁盘上,或者在网络中进行传输。这是Java平台提供的一种功能,允许程序员将任何Java对象持久化,即将其状态保存到磁盘,或者在网络中进行传输。...
在这个实验中,学习了如何利用第三方库实现Java对象到XML的序列化。XStream库的使用简化了这个过程,使得我们可以方便地在Java对象和XML格式之间进行转换,这对于数据交换和持久化具有很高的实用价值。同时,这也...
【JAVA对象序列化保存为XML文件的工具类】 在Java编程中,对象序列化是一种将对象的状态转换为字节流的过程,以便可以存储或在网络上传输。而在反序列化时,这个字节流又可以恢复为原来的对象。Java提供了一个方便...
深入探索Java对象的序列化 ...一般来说,没有必要自己实现序列化接口,直接交给Java虚拟机是上策。 实现了序列化接口的类,如果其成员不需要序列化进去,则使用transient关键字进行修饰。 下面给出个例子:
Java对象的序列化是Java平台提供的一种将对象转化为字节序列的能力,以便于存储或在网络中传输。这个特性使得任何实现了Serializable接口的Java对象都可以被转换成一系列的字节,之后这些字节可以完全恢复,重新生成...
为了实现序列化,Java提供了一种机制,即要求对象所属的类实现`Serializable`或`Externalizable`接口。`Serializable`是一个标记接口,而`Externalizable`则提供了更精细的控制,允许开发者自定义序列化和反序列化的...
在Java中,如果一个类需要支持序列化,那么这个类就需要实现`java.io.Serializable`接口,尽管该接口没有任何方法需要实现,但它的存在就标志着这个类的对象可以被序列化。 首先,我们来看一下`SerializableDemo`这...
要实现Java对象的序列化,对象所在的类需要实现`Serializable`接口。例如,`String`和`Date`等Java内置类已经默认实现了这个接口。如果一个类没有实现`Serializable`,尝试对其进行序列化时,`ObjectOutputStream`的...