java 自定义序列化
2016-02-28 16:20
399 查看
如果采用java序列化的方式传输java对象,我觉得最好还是采用自定义序列化的方式来完成。下面就来看看如何利用readObject,writeObject,writeReplace,readResolve这4个私有方法来自定义序列化的过程。
1)第一个场景,我们希望在序列化的过程中改变那些被transient修饰的变量,
利用readObject和writeObject两个函数,改变transient修饰变量的序列化行为。
2)第二个场景,保障单例的安全性,
在readObject之后,利用readResolve函数返回单例对象,保障了单例的安全性,若不重写该方法,反序列化的对象则是一个新的对象。
3)第三个场景,替换序列化的对象
在调用writeObject之前,利用writeReplace函数,替换要被序列化的对象,
通过这个return函数就可以替换当前需要序列化的对象。
1)第一个场景,我们希望在序列化的过程中改变那些被transient修饰的变量,
class TestSer implements Serializable { String name; transient int age; private void readObject(ObjectInputStream in) throws Exception { in.defaultReadObject(); this.age = in.readInt(); } private void writeObject(ObjectOutputStream ou) throws Exception { ou.defaultWriteObject(); ou.writeInt(this.age); } }
利用readObject和writeObject两个函数,改变transient修饰变量的序列化行为。
2)第二个场景,保障单例的安全性,
class Single implements Serializable { /** * */ private static final long serialVersionUID = 1L; String name; private static class InstanceHandler { private static final Single s = new Single(); } public static Single getInstance() { return InstanceHandler.s; } private Single() {} private Object readResolve() { return InstanceHandler.s; } }
在readObject之后,利用readResolve函数返回单例对象,保障了单例的安全性,若不重写该方法,反序列化的对象则是一个新的对象。
3)第三个场景,替换序列化的对象
在调用writeObject之前,利用writeReplace函数,替换要被序列化的对象,
private Object writeReplace() { return this; }
通过这个return函数就可以替换当前需要序列化的对象。
相关文章推荐
- 【Java】(一)运算符小结(算数运算符)
- maven 报错 Missing artifact com.microsoft.sqlserver:sqljdbc4:jar:jdk15:4.0:4.0
- Java大牛养成记(1)——J2EE13规范
- Java通过缓存队列执行任务代码实现
- ZOJ-3714-Java Beans【10th浙江省赛】
- Java多线程之ReentrantReadWriteLock
- eclipse如何下载插件
- java并发内存模型
- Spring Bean装配-resouce
- eclipse maven failOnMissingWebXml问题处理
- 【Java】引用类型小结
- Java的数据类型
- 发布一个java Servlet (静态发布)
- Java之内部类
- 20160228 java练习io
- 算法代码实现之插入排序,Java实现
- Java socket编程
- java Junit 测试中异常处理
- JDK,JRE,JVM的作用及关系,和环境变量配置
- Spring Bean装配-自动装配