java 对象 serializable_Java中对象序列化(Serializable)

对象序列化是最简单的 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 的应用程序中使用它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值