- 浏览: 41831 次
- 性别:
- 来自: 未知
最新评论
-
teasp:
哪有两个Long啊?分明是两个long,这是原始类型,它们所占 ...
如何计算java内存大小--谁吃了对象引用的16byte? -
niwtsew:
楼主总结的不错,我也有此体会。一定要淡定
这段代码不是我写的
1.Serializable接口
只是一个表识接口,仅仅是告诉jvm这是一个可以序列化的接口。
2.serialVersionUID
只要这个UID的值不变,在序列化的版本中增加属性或者减少属性就不会报错;否则当版本变更后,再反序列会报错;
如果自己不定义,每次在编译的时候,编译器会自动生成一个值,但是不能保证每次编译时的值都一样,所以务必自己定义!
3.readResolve、readObject、writeReplace、writeObject接口
public class FooImpl implements java.io.Serializable{ private String message; public String getFoo() { return message; } public void setMessage(String message) { this.message = message; } private void writeObject(java.io.ObjectOutputStream out) throws IOException { System.out.println("writeObject invoked"); out.writeObject(this.message == null ? "hohohahaha" : this.message); } private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { System.out.println("readObject invoked"); this.message = (String) in.readObject(); } private Object writeReplace() throws ObjectStreamException { System.out.println("writeReplace invoked"); return this; } private Object readResolve() throws ObjectStreamException { System.out.println("readResolve invoked"); return this; } public Object serialize() throws IOException, ClassNotFoundException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(this); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); return ois.readObject(); } public static void main(String[] args) throws IOException, ClassNotFoundException { FooImpl fooimpl = new FooImpl(); fooimpl.serialize(); } }
我们运行这段代码看到的debug信息:
writeReplace invoked (序列化时调用)
writeObject invoked (序列化时调用)
readObject invoked (反序列化时调用)
readResolve invoked(反序列化时调用)
4.Externalizable
Externalizable 是一个有实际方法需要实现的interface,包括writeExternal和readExternal,是Serializable接口的子接口:
- public class FooImpl implements java.io.Externalizable {
- private String message;
- public String getFoo() {
- return message;
- }
- public void setMessage(String message) {
- this.message = message;
- }
- private Object writeReplace() throws ObjectStreamException {
- System.out.println("writeReplace invoked");
- return this;
- }
- private Object readResolve() throws ObjectStreamException {
- System.out.println("readResolve invoked");
- return this;
- }
- public Object serialize() throws IOException, ClassNotFoundException {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- ObjectOutputStream oos = new ObjectOutputStream(baos);
- oos.writeObject(this);
- ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
- ObjectInputStream ois = new ObjectInputStream(bais);
- return ois.readObject();
- }
- public void readExternal(ObjectInput arg0) throws IOException,
- ClassNotFoundException {
- System.out.println("readExternal invoked");
- Object obj = arg0.readObject();
- }
- public void writeExternal(ObjectOutput arg0) throws IOException {
- System.out.println("writeExternal invoked");
- arg0.writeObject("Hello world");
- }
- public static void main(String[] args) throws IOException,
- ClassNotFoundException {
- FooImpl fooimpl = new FooImpl();
- fooimpl.serialize();
- }
- }
我们运行这段代码看到的debug信息:
writeReplace invoked
writeExternal invoked
readExternal invoked
readResolve invoked
在此writeExternal 和readExternal 的作用与writeObject和readObject 一样.
最后,当我们同时实现了两个interface的时候,JVM只运行Externalizable 接口里面的writeExternal 和readExternal 方法对序列化内容进行处理.
需要注意的是:Serializable是一个真正的mark interface,
writeObject,readObject, writeReplace,readResolve是直接与JVM通信,告诉JVM序列化的内容.
发表评论
-
系统的性能优化--记项目总结
2011-09-06 00:40 1110项目过去都3个多月了, ... -
转载:面向程序员的数据库访问性能优化法则
2010-12-22 00:06 756http://blog.csdn.net/yzsind/arc ... -
logger的功能
2010-07-19 23:40 9201.最明显的功能,排查线上问题。 平时遇到bug时,要 ... -
我们需要什么样的logger
2010-07-19 23:28 874在生产环境中,针对具 ... -
大资源的分配与控制
2010-07-19 23:13 754在应用中,总有一些业务操作可能会引起大数据量的查询,基于应用健 ... -
缓存小技巧--实现cache的锁
2010-07-19 22:34 1180在有些业务背景下,需要cache防止并发的情况,然后cache ... -
缓存小技巧--缓存的分级
2010-07-19 22:22 912在大型的互联网应用中,如果缓存的是大量的数据,可以考虑多级缓存 ... -
缓存小技巧--缓存key的分组
2010-07-19 22:15 2323这篇没有任何技术含量,仅仅是一个良好的编程习惯 随着应 ... -
缓存小技巧--key的关联性
2010-07-19 22:11 1557如果我们对一个比较复杂的模型做cache,会有如下需求: 1 ... -
缓存小技巧--NullObject模式&&表识cache
2010-07-19 22:01 1009在我们的应用中,有一张表的查询量非常之大,高峰期时6000次/ ... -
缓存小技巧--异步更新缓存时remove cache数据
2010-07-12 23:24 3951在支撑大规模、高并发、高可用的互联网应用中,异步更新分布式缓存 ... -
AOP应用
2010-06-26 15:51 908AOP应用已经很广了,谈一谈平时工作用到的地方: 1. 打印 ... -
胆大心细的游戏--SOA环境下系统重构
2009-12-29 02:40 0站坑。。。 -
探寻ThoughtWorks的敏捷实践,专访ThoughtWorks咨询师 <摘要>
2009-11-24 13:52 1052敏捷包括TDD、重构、简单设计、持续集成等。 TDD确保编码 ... -
Don’t Ask, Tell
2009-11-17 02:55 822Don’t Ask, Tell 先举一个计算工资的老例 ... -
Java对象的强、软、弱和虚引用
2009-11-12 20:03 630在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程 ... -
复杂对象的输出--定制toString
2009-10-28 20:50 1671先来看一个类 public class ComplexObj ... -
可伸缩性的艺术(2)
2009-07-26 16:41 879本来翻译出来想放在技 ... -
可伸缩性的艺术(1)
2009-07-26 16:36 1175本来翻译出来想放在技 ... -
一些实用命令
2009-05-26 11:05 5521.windows下的删除 还在为windows下删除大文件 ...
相关推荐
Java序列化是Java平台中的一种核心机制,它允许对象的状态被转换成字节流,以便存储到磁盘、数据库,或者在网络中进行传输。这对于实现持久化、远程方法调用(RMI)以及Enterprise JavaBeans(EJB)等高级功能至关...
Java反序列化是一种将已序列化的对象状态转换回对象的过程,它是Java平台中持久化数据的一种常见方式。在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络间传输对象。然而,这个过程也可能引入...
### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...
Java序列化是Java平台提供的一种持久化机制,它允许我们将一个Java对象转换为字节流,以便存储到磁盘上,或者通过网络进行传输。这使得我们可以保存和恢复对象的状态。实现序列化的类需要实现`Serializable`接口,...
总结,Java序列化是一个强大的工具,但使用时需注意其潜在的风险和性能影响。理解序列化的工作原理,并合理运用,可以在许多场景下提高软件的灵活性和可维护性。在实际项目中,结合淘宝等大型系统的具体需求,序列化...
### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化是什么? 序列化是指将程序中的对象转换为字节流的过程,从而方便存储或传输这些对象。通常,序列化用于将对象的状态(即其实例变量的值,而非...
### Java序列化原理与算法详解 #### 序言 在现代软件开发中,尤其是在网络通信和数据持久化领域,对象的序列化与反序列化扮演着至关重要的角色。Java作为一种广泛应用的编程语言,提供了强大的内置支持来实现序列化...
总结来说,C#和Java的序列化和反序列化机制都是各自语言中不可或缺的一部分,它们使得数据能够在不同环境之间自由流动。理解和掌握这些技术对于任何软件开发者来说都是非常重要的,特别是涉及到数据持久化、网络通信...
Java对象的序列化和反序列化是Java编程中一项...总结,Java对象的序列化和反序列化是Java编程中的基础概念,它涉及到数据持久化、网络通信等多个方面。理解并熟练运用这一技术,能够帮助开发者更有效地管理和传递数据。
**一、Java序列化** 1. **什么是序列化**:序列化是将对象的状态(属性和成员变量)转换为可以存储或传输的数据格式的过程。在Java中,通常是将对象转换为字节数组,以便写入磁盘或通过网络发送。 2. **为什么需要...
Java序列化是将对象转换为字节流的过程,目的是为了保存对象的状态以便稍后恢复或传输到其他地方。通过实现`Serializable`接口,一个Java对象就可以被序列化。这个接口是一个标记接口,没有定义任何方法,仅表示对象...
通过实例深入了解 Java 序列化 Java 序列化是 Java 系列技术中一个较为重要的技术点,用于将 Java 对象序列化为二进制文件。开发人员只需要了解被序列化的类需要实现 Serializable 接口,使用 ObjectInputStream 和...
总结来说,Java对象序列化是将对象状态转换为字节流,便于存储和网络传输的关键技术。通过实现`Serializable`或`Externalizable`接口,我们可以控制对象如何被序列化和反序列化,同时`transient`关键字提供了保护...
Java序列化是将Java对象转换为字节流的过程,以便可以在磁盘、数据库或网络上存储或传输这些对象。这使得我们能够保存对象的状态,并在稍后的时间点恢复它,或者在网络之间传递对象。反序列化是相反的过程,即从字节...
总结,Java对象序列化是一种强大但需要谨慎使用的工具。了解其原理和注意事项,可以帮助开发者充分利用这一特性,同时避免潜在的问题。在实际应用中,要权衡序列化的优点和可能带来的安全、性能挑战,选择最适合项目...
总结起来,Netty中的Java序列化是通过实现`Serializable`接口的对象转换为字节流,然后使用`ByteBuf`在网络中传输的一种方式。在实际开发中,我们可以根据性能需求选择合适的序列化策略,并结合Netty的强大功能,...
### Java序列化的机制和原理 #### 一、序列化与反序列...总结来说,Java序列化机制提供了对象序列化和反序列化的能力,使得对象可以跨网络传输或存储于磁盘上。理解序列化的原理对于开发基于网络的应用程序尤其重要。
总结,Java中的JSON序列化与反序列化是数据交互的重要环节,Jackson和Gson是两个常用的库,它们提供了丰富的功能和良好的API设计,使得处理JSON数据变得简单高效。通过理解和掌握这些知识,开发者可以更好地在Java...
在Java编程语言中,克隆和序列化是两个...总结来说,Java中的克隆和序列化是两个强大的工具,它们在数据持久化、对象复制以及网络通信等方面有着广泛的应用。理解和熟练掌握这两个概念,对于Java开发者来说至关重要。