- 浏览: 193649 次
- 性别:
- 来自: 苏州
-
文章分类
最新评论
-
wanglijunjsj:
谢谢,很有用
java log4j的一些总结 -
lxb_champagne:
this.init(); 类都没初始化好,this没用的。
java final变量的初始化问题 -
lg_asus:
上面代码有点小问题,最新代码:
public class Pr ...
判断素数 -
lg_asus:
测试10 million的以内的数据,算出所有素数时间在500 ...
判断素数 -
lg_asus:
文章中说错了:如果只是找一个数在不在其中,则可以直接遍历一次, ...
40亿不重复的正整数,如何判断一个数是否在其中
转:http://developer.51cto.com/art/201104/257839.htm
正常情况下,一个类实现java序列化很简单,只需要implements Serializable接口即可,之后该类在跨jvm的传输过程中会遵照默认java序列化规则序列化和反序列化;不同jvm版本之间序列化方式稍有不同,但基本上都是兼容的。
AD:
正常情况下,一个类实现java序列化很简单,只需要implements Serializable接口即可,之后该类在跨jvm的传输过程中会遵照默认java序列化规则序列化和反序列化;不同jvm版本之间序列化方式稍有不同,但基本上都是兼容的。
在某些特殊情况下,可能需要自定义序列化和反序列化的行为,看下面例子:
Java代码
class AbstractSerializeDemo {
private int x, y;
public void init(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void printXY() {
System.out.println("x:" + x + ";y:" + y);
}
}
public class SerializeDemo extends AbstractSerializeDemo implements Serializable {
private int z;
public SerializeDemo() {
super.init(10, 50);
z = 100;
}
public void printZ() {
super.printXY();
System.out.println("z:" + z);
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
SerializeDemo sd = new SerializeDemo();
sd.printZ();
out.writeObject(sd);
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));
SerializeDemo sd2 = (SerializeDemo) in.readObject();
sd2.printZ();
}
}
这段程序表示了一个可序列化的类继承自一个非序列化的有状态超类,期望的结果是,子类序列化以后传输并反序列化回来,原先的值域包括超类的值域都保持不变。
但是输出是:
Java代码
x:10;y:50
z:100
x:0;y:0
z:100
结果和期望不符,子类的值域保留下来了,但是超类的值域丢失了,这对jvm来说是正常的,因为超类不可序列化;
为了解决这个问题,只能自定义序列化行为,具体做法是在SerializeDemo里加入以下代码:
Java代码
private void writeObject(ObjectOutputStream os) throws IOException {
os.defaultWriteObject();//java对象序列化默认操作
os.writeInt(getX());
os.writeInt(getY());
}
private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException {
is.defaultReadObject();//java对象反序列化默认操作
int x=is.readInt();
int y=is.readInt();
super.init(x,y);
}
writeObject和readObject方法为JVM会在序列化和反序列化java对象时会分别调用的两个方法,修饰符都是private,没错。
我们在序列化的默认动作之后将超类里的两个值域x和y也写入object流;与之对应在反序列化的默认操作之后读入x和y两个值,然后调用超类的初始化方法。
再次执行程序之后的输出为:
Java代码
x:10;y:50
z:100
x:10;y:50
z:100
另外还有两个自定义序列化方法writeReplace和readResolve,分别用来在序列化之前替换序列化对象 和 在反序列化之后的对返回对象的处理。一般可以用来避免singleTon对象跨jvm序列化和反序列化时产生多个对象实例,事实上singleTon的对象一旦可序列化,它就不能保证singleTon了。JVM的Enum实现里就是重写了readResolve方法,由JVM保证Enum的值都是singleTon的,所以建议多使用Enum代替使用writeReplace和readResolve方法。
Java代码
private Object readResolve()
{
return INSTANCE;
}
private Object writeReplace(){
return INSTANCE;
}
注:writeReplace调用在writeObject前;readResolve调用在readObject之后。
正常情况下,一个类实现java序列化很简单,只需要implements Serializable接口即可,之后该类在跨jvm的传输过程中会遵照默认java序列化规则序列化和反序列化;不同jvm版本之间序列化方式稍有不同,但基本上都是兼容的。
AD:
正常情况下,一个类实现java序列化很简单,只需要implements Serializable接口即可,之后该类在跨jvm的传输过程中会遵照默认java序列化规则序列化和反序列化;不同jvm版本之间序列化方式稍有不同,但基本上都是兼容的。
在某些特殊情况下,可能需要自定义序列化和反序列化的行为,看下面例子:
Java代码
class AbstractSerializeDemo {
private int x, y;
public void init(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void printXY() {
System.out.println("x:" + x + ";y:" + y);
}
}
public class SerializeDemo extends AbstractSerializeDemo implements Serializable {
private int z;
public SerializeDemo() {
super.init(10, 50);
z = 100;
}
public void printZ() {
super.printXY();
System.out.println("z:" + z);
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
SerializeDemo sd = new SerializeDemo();
sd.printZ();
out.writeObject(sd);
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));
SerializeDemo sd2 = (SerializeDemo) in.readObject();
sd2.printZ();
}
}
这段程序表示了一个可序列化的类继承自一个非序列化的有状态超类,期望的结果是,子类序列化以后传输并反序列化回来,原先的值域包括超类的值域都保持不变。
但是输出是:
Java代码
x:10;y:50
z:100
x:0;y:0
z:100
结果和期望不符,子类的值域保留下来了,但是超类的值域丢失了,这对jvm来说是正常的,因为超类不可序列化;
为了解决这个问题,只能自定义序列化行为,具体做法是在SerializeDemo里加入以下代码:
Java代码
private void writeObject(ObjectOutputStream os) throws IOException {
os.defaultWriteObject();//java对象序列化默认操作
os.writeInt(getX());
os.writeInt(getY());
}
private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException {
is.defaultReadObject();//java对象反序列化默认操作
int x=is.readInt();
int y=is.readInt();
super.init(x,y);
}
writeObject和readObject方法为JVM会在序列化和反序列化java对象时会分别调用的两个方法,修饰符都是private,没错。
我们在序列化的默认动作之后将超类里的两个值域x和y也写入object流;与之对应在反序列化的默认操作之后读入x和y两个值,然后调用超类的初始化方法。
再次执行程序之后的输出为:
Java代码
x:10;y:50
z:100
x:10;y:50
z:100
另外还有两个自定义序列化方法writeReplace和readResolve,分别用来在序列化之前替换序列化对象 和 在反序列化之后的对返回对象的处理。一般可以用来避免singleTon对象跨jvm序列化和反序列化时产生多个对象实例,事实上singleTon的对象一旦可序列化,它就不能保证singleTon了。JVM的Enum实现里就是重写了readResolve方法,由JVM保证Enum的值都是singleTon的,所以建议多使用Enum代替使用writeReplace和readResolve方法。
Java代码
private Object readResolve()
{
return INSTANCE;
}
private Object writeReplace(){
return INSTANCE;
}
注:writeReplace调用在writeObject前;readResolve调用在readObject之后。
发表评论
-
Java String.intern()
2017-09-14 18:44 623在看《深入理解Java虚拟机》第二章中有如下代码: Str ... -
java开发小技巧
2013-02-28 10:06 868前面几篇blog记录的都是java中一些很基础的知识,但不经常 ... -
泛型类不能继承Throwable及其子类
2013-02-22 16:35 1416class A<T> extends Throwa ... -
根据totalRecordSize和pageRecordSize求pageCount
2013-02-18 18:18 1007一直使用(totalRecordSize - 1) / pag ... -
maven学习笔记
2013-01-18 18:27 0eclipse运行需要jre环境,在编译java文件时可以没有 ... -
开发规范
2013-01-07 13:25 8371:制定API的时候,一定要考虑到参数类型、方法返回类型和所能 ... -
java异常
2012-12-28 10:30 1208运行时异常可以不捕获,即使一段代码不可能抛出这个Runtime ... -
java NIO中的Selector SelectableChannel SelectionKey
2012-12-10 14:36 1374推荐参考: http://rox-xmlrpc.sourcef ... -
java NIO通信小例子
2012-12-05 09:53 0Server端代码,selector线程专门负责接收连接,re ... -
java中CyclicBarrier和CountDownLatch的异同
2012-11-23 16:11 1550CountDownLatch只能使用一次,cyclicBarr ... -
Java&Js正则
2012-11-16 16:51 808greedy, reluctant, possessive 三 ... -
java多语言
2012-11-09 15:41 1195在eclipse plugin编程中,可以直接用继承NLS这个 ... -
URL访问文件
2012-11-01 15:57 998try{ // URL url = new URL( ... -
java 正则小知识
2012-10-11 18:43 0(?=X) X, via zero-width positiv ... -
Thinking In Java 4th 关于Annotation处理器的观察者模式
2012-08-13 09:43 1092首先先定义SQLString SQLInteger Const ... -
cxf发布WS,如何在pojo中得到web.xml中配置
2012-08-02 18:48 1154用cxf直接将一个pojo作为WS进行发布,如果想在pojo中 ... -
去除代码行中前面的数字
2012-07-30 10:56 1261在网上看demo,复制代码下来执行,通常前面的行数也一起复制了 ... -
java rmi
2012-07-16 16:02 708==引自http://www.cnblogs.com/nina ... -
java取MAC地址
2012-07-12 11:29 1182jdk1.6中,NetworkInterface这个类提供了g ... -
java压缩与解压缩
2012-07-11 19:31 911public class Test5 { publ ...
相关推荐
Java序列化是Java平台中的一种标准机制,允许将对象的状态转换为字节流,以便存储在磁盘上、通过网络进行传输或者在某些时候恢复原来的对象状态。这一过程包括两个主要步骤:对象的序列化(将对象转换为字节流)和反...
Java序列化是Java平台中的一种持久化机制,它允许对象的状态被转换成字节流,以便存储、网络传输或在不同时间点恢复。这个过程被称为序列化,而反向操作称为反序列化。序列化在许多场景下都非常有用,比如在分布式...
java 序列化和反序列化的方法 Java 序列化和反序列化是 Java 语言中的一种机制,用于将对象转换为字节流,以便在网络上传输或存储。序列化是将对象转换为字节流的过程,而反序列化是将字节流转换回对象的过程。 在...
### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...
【Protocol Buffer序列化对比Java序列化】 Protocol Buffer(简称PB)是Google开发的一种高效的数据序列化协议,而Java序列化是Java平台内置的一种序列化机制。两者的主要目标都是将对象转化为字节数组,便于在网络...
Java序列化是Java平台提供的一种持久化机制,它允许我们将一个Java对象转换为字节流,以便存储到磁盘上,或者通过网络进行传输。这使得我们可以保存和恢复对象的状态。实现序列化的类需要实现`Serializable`接口,...
Java序列化是Java平台中的一种核心机制,它允许对象的状态被转换成字节流,以便存储到磁盘、数据库,或者在网络中进行传输。这对于实现持久化、远程方法调用(RMI)以及Enterprise JavaBeans(EJB)等高级功能至关...
### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化是什么? 序列化是指将程序中的对象转换为字节流的过程,从而方便存储或传输这些对象。通常,序列化用于将对象的状态(即其实例变量的值,而非...
Java序列化是Java平台中的一种标准机制,它允许将对象的状态转换为字节流,以便存储、传输或恢复。在Java中,一个类如果要实现序列化,需要实现`Serializable`接口,这是一个标记接口,不包含任何方法。下面我们将...
Java序列化是Java平台中的一项重要技术,它允许对象的状态被转换为字节流,以便存储或通过网络进行传输。这种技术在分布式系统、持久化存储以及数据交换等场景中非常常见。本资源包含了三个流行的Java序列化框架:...
Java序列化是Java平台提供的一种将对象转换为字节流,以便存储、在网络上传输或者在后续时间重新创建相同对象的机制。这是Java编程中一个非常重要的概念,尤其是在分布式环境和持久化存储中。让我们深入探讨一下Java...
### Java序列化原理与算法详解 #### 序言 在现代软件开发中,尤其是在网络通信和数据持久化领域,对象的序列化与反序列化扮演着至关重要的角色。Java作为一种广泛应用的编程语言,提供了强大的内置支持来实现序列化...
Java序列化面试题(10题) 在 Java 中,序列化是一种用于处理对象流的机制,它可以将对象的内容进行流化,使其可以被读写和传输。下面是 10 个与 Java 序列化相关的面试题目: 1. 什么是 Java 序列化,如何实现 ...
Java序列化是Java平台中的一种标准机制,允许对象的状态被保存到磁盘或者在网络中进行传输,以便在后续的时间或地点恢复这些对象。这个过程包括两个主要操作:序列化(将对象转换为字节流)和反序列化(将字节流恢复...
Java序列化是Java平台提供的一种持久化对象的机制,它允许我们将对象的状态转换为字节流,以便存储或在网络上传输。在这个特定的场景中,我们关注的是如何使用Java序列化来多次追加对象到一个TXT文件,而不是覆盖...
### Java序列化与反序列化详解 #### 一、Java序列化概述 Java序列化(Serialization)是一项重要的功能,它可以将对象的状态转化为一系列字节,从而实现对象的持久化存储或在网络上传输。序列化机制使得Java对象...
### Java对象序列化标准知识点详解 #### 一、系统架构概览 **1.1 概览** Java 对象序列化是一种将Java对象的...以上内容涵盖了Java序列化标准的关键知识点,深入了解这些概念有助于更好地理解和应用Java序列化技术。
Java序列化漏洞是一种常见的安全问题,它出现在Java应用程序中,当对象被转化为字节流以便在网络间或存储中传输时。这种序列化过程如果处理不当,可能会导致远程代码执行(RCE)、信息泄露或者权限提升等严重后果。...
android(包括java)序列化一个对象传给php去做处理,或是接到php的序列化的对象在java中做处理的工具jar包以及使用方法. 使用方法: byte[] b = null; b = PHPSerializer.serialize(一个对象);//将一个对象序列化后返回...
Java序列化是将Java对象转换为字节流的过程,以便可以在网络上传输或存储在磁盘上。这使得数据能够跨不同的系统平台进行传输和持久化。Protocol Buffers(protobuf)是Google推出的一种高效、跨平台的数据序列化协议...