Java 对象序列化

转载 2007年10月11日 19:53:00

对象序列化是最简单的 Java 持久性策略。对象序列化是一个将对象图平面化为一个字节的线性序列的过程。对象图是作为对象继承、关联和聚合的结果而实现的一些关系式。对象的非暂态实例属性以字节的形式被写入到持久存储中。实例属性的值就是执行时间序列化时内存中的值。如果一个 Java 对象是可序列化的,那么它至少必须实现 java.io.Serializable 接口,该接口具有如下所示的结构:

package java.io;
public interface Serializable
{}

您可以看到, java.io.Serializable 接口并没有声明任何方法。它是一个 记号或者 标记接口。它告诉 Java 运行时环境,该实现类是可序列化的。列表 1 显示实现该接口的一个示例类。

列表 1. MySerializableObject.java

import java.io.Serializable;

public class MySerializableObject extends MySuperClass implements Serializable
{
private String property1 = null;
private String property2 = null;

public String getProperty1()
{
return property1;
}

public void setProperty1(String val)
{
property1 = val;
}
public String getProperty2()
{
return property2;
}

public void setProperty2(String val)
{
property2 = val;
}
private void writeObject(ObjectOutputStream out)
throws IOException
{
out.writeObject (getProperty1 ());
out.writeObject (getProperty2 ());
}

private void readObject (ObjectInputStream in)
throws IOException, ClassNotFoundException
{
setProperty1 ((String) in.readObject ());
setProperty2 ((String) in.readObject ());
}
}

无需自己实现 writeObject(...) 和 readObject(...) 方法来执行序列化;Java 运行时环境具有使这些方法可用的默认实现。然而,您可以重写这些方法,提供如何存储对象状态的您自己的实现。

 

关于序列化,您需要记住一些要点。首先,在序列化期间,整个对象图(即,所有父类和被引用类)都将被序列化。其次, Serializable 类的所有实例变量自身都应该是可序列化的,除非已经特别声明它们为暂态,或者已经重写 writeObject(...) 和 readObject(...) 来只序列化那些可序列化的实例变量。如果违反了后一规则,在运行时将出现一个异常。

每个后续 J2SE 版本都对对象序列化系统进行少量的增加。J2SE 1.4 也相应地向 ObjectOutputStream and ObjectInputStream 增加 writeUnshared() and readUnshared() 方法。通常,一个序列化的流只包含任何给定对象的一个序列化实例,并且共享对该对象引用的其他对象可以对它进行后向引用。通常期望序列化一个对象独立于其他对象可能维护的任何引用。非共享的读写方法允许对象作为新的、独一无二的对象被序列化,从而获得一个类似于对象克隆但开销更少的效果。

Java 对象序列化存在的问题
序列化涉及到将对象图从内存具体化到持久存储(例如硬盘)中。这涉及到大量 I/O 开销。通常,对应用程序而言,序列化并不是最佳选择:

管理几十万兆字节的存储数据
频繁地更新可序列化对象
对存储企业数据而言,序列化是一个错误选择,因为:

序列化的字节流只对 Java 语言是可读的。这是一个重大缺陷,因为企业系统通常是异构的,许多应用程序要与其他应用程序共同处理相同的数据。

对象检索涉及大量的 I/O 开销。

没有一个用来从序列化对象图中检索获取数据的查询语言。

序列化没有内置的安全机制。

序列化本身并不提供任何事务控制机制,因此不能在那些需要并发访问从而不使用辅助 API 的应用程序中使用它。

Java对象序列化详解

所有分布式应用常常需要跨平台,跨网络,因此要求所有传的参数、返回值都必须实现序列化。一、定义  序列化:把Java对象转换为字节序列的过程。      反序列化:把字节序列恢复为Java对象的过程...
  • zcl_love_wx
  • zcl_love_wx
  • 2016年08月10日 14:47
  • 4341

Java 对象序列化机制详解

对象序列化的目标:将对象保存到磁盘中,或允许在网络中直接传输对象。 对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上,通过网络将这种二进制流...
  • zuiwuyuan
  • zuiwuyuan
  • 2014年10月09日 22:24
  • 1066

Java序列化对象的存储和读取

本文通过一个示例讲解java序列化对象的存储和读取存储文件使用的是:ObjectOutputStream和它的方法writeObject来进行写入对象,可以写入任何类型的数据;读取文件使用Object...
  • wenzhi20102321
  • wenzhi20102321
  • 2016年11月13日 11:35
  • 2289

java序列化之后,对象的引用关系?

今天写代码的时候用到序列化,不过突然想到这个问题。 于是写了一些测试代码,得出两个结论。 如果两个对象存在引用关系,比如A引用B。 如果两个对象是各自序列化的,则引用关系不再存在。 如果两个对象是是...
  • linger2012liu
  • linger2012liu
  • 2014年07月24日 19:44
  • 1955

Java序列化对象的存储和读取

本文对javaIO流中序列化徐对象的写入和读取方法做示例演示。
  • wenzhi20102321
  • wenzhi20102321
  • 2016年09月30日 13:41
  • 1333

java JSONObject对象序列化与反序列化

首先需要导入一下包 json-lib-2.3-jdk15.jar  commons-beanutils-1.7.0.jar  commons-httpclient-3.1.jar  commons-l...
  • Mr_linjw
  • Mr_linjw
  • 2016年02月17日 17:08
  • 4551

Java中对象序列化的作用是什么?java RMI是什么意思?

转自:http://hi.baidu.com/lanqibaoer/item/9366062187f7271642634a2f ***Java中对象序列化的作用是什么?   1、序列化是干...
  • onlyonename
  • onlyonename
  • 2013年01月02日 12:21
  • 2816

Java中对象集合的序列化

java的IO中提供了一个 ObjectOutputStream对象,其中的方法writeObject()文档如下: /** * Write the specified object...
  • d8111
  • d8111
  • 2015年04月24日 17:48
  • 7288

怎样对带有不可序列化属性的Java对象进行序列化

出于很多原因我们想使用自定义的序列化方法取代Java默认的机制。一个最常见的原因是提高性能,而另一个原因是有时候我们无法使用默认的序列化方法。在这篇文章中,我们具体来讨论怎样通过定制的序列化方法,对一...
  • CSDN_LQR
  • CSDN_LQR
  • 2016年05月20日 20:32
  • 2019

Java Socket传输对象(序列化)

1.首先需要一个普通的对象类,由于需要序列化这个对象以便在网络上传输,所以实现java.io.Serializable接口就是必不可少的了...
  • SHEN525758203
  • SHEN525758203
  • 2014年08月08日 13:58
  • 2468
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java 对象序列化
举报原因:
原因补充:

(最多只允许输入30个字)