如果我尝试序列化静态属性会发生什么?
thanks
由此article http://java.sys-con.com/node/36149:
技巧 1:处理静态变量
Java classes often hold some
globally relevant value in a static
class variable. We won't enter into
the long history of the debate over
the propriety of global variables -
let's just say that programmers
continue to find them useful and the
alternatives suggested by purists
aren't always practical.
对于静态变量
声明时初始化,
序列化不存在任何
特殊问题。第一次
使用类,变量在
问题将被设置为正确的
价值。
某些静态数据无法初始化
方式。例如,它们可以由以下方式设置
一个人在运行期间
程序。假设我们有一个静态的
打开调试的变量
输出在一个类中。这个变量可以
通过向服务器发送一些内容来设置
消息,可能来自监视器
程序。我们也会想象当
服务器收到此消息后,
操作员希望在以下位置打开调试
该类的所有后续使用
连接到的客户端
服务器。
程序员现在面临着一个
困难。当有问题的班级
到达客户端后,静态
变量的值不随之而来。
但是,它包含默认的
静态时设置的
类的无参构造函数是
打电话给writeObject()
。怎样才能
客户端程序接收新的
正确的值?
程序员可以创建另一个
消息类型并将其传输到
客户;然而,这需要一个
消息类型的激增,
破坏了使用的简单性
序列化可以实现
消息传递。我们提出的解决方案
with 是针对需要的类
静态传输包括
“静态传输器”内部类。这
类知道所有静态
其外部类中的变量必须
被设置。它包含一个成员变量
对于每个静态变量必须是
连载了。静态传输器副本
将静态值放入其成员变量中
在里面writeObject()
的方法
班级。这readObject()
方法
“解开”这个包并传输
服务器的静态设置
变量给客户端。既然它是一个
内部类,它将能够写入
外部类的静态变量,
无论隐私级别如何
他们被宣布。
并从另一个article http://www.ecst.csuchico.edu/~amk/foo/advjava/notes/serial.html:
静态或瞬态数据
然而,这种“轻松”在现实中却并非如此。
所有情况。正如我们将看到,
序列化并不那么容易应用
具有静态或瞬态的类
数据成员。仅关联数据
类的特定实例是
序列化,因此静态数据,
即与类关联的数据
与实例相反,不是
自动序列化。序列化
数据存储在静态变量一中
必须提供特定于类别的
序列化。
类似地,某些类可以定义
用作临时数据成员
变量。序列化这些数据
成员可能是不必要的。一些
瞬态数据的示例包括
运行时统计信息或哈希表
映射参考。这些数据应该
用瞬态修饰符标记
以避免序列化。瞬态,由
定义,用于指定数据
程序员不具备的成员
想要或需要序列化。看
Java 简述,第 174 页:鼠标
位置、首选大小、文件句柄
(机器特定(本机代码))。
编写代码时,如果有东西
声明瞬态,然后触发
(对程序员)的必要性
特殊代码的可能性
稍后连载。
要序列化一个对象,您可以创建
某种 OutputStream 对象和
然后将其包裹在一个
ObjectOutputStream 对象。在这
点你只需要打电话writeObject()
你的对象是
神奇地序列化并发送到
输出流。为了扭转这个过程,
你将一个InputStream包装在一个
ObjectInputStream 并调用readObject(
)。返回的是,如
通常,向上转换对象的句柄,
所以你必须沮丧地安排事情
直的。如果你需要动态
查询对象的类型,可以
使用 getClass 方法。具体来说dk.getClass.getName()
返回名称
那个班级的dk
是一个实例
的。即,这要求对象提供
其对应的类名
目的。 (嗯,确实如此,但是呢
句法?我还需要知道它是什么
就是声明它...太糟糕了)(C++可以
在一次操作中执行此操作(dynamic_cast
(如果类型错误则返回 null)),java 可以
使用instanceof
操作员检查是否
我是这么想的(参见 Core Java,Ch5
继承、铸造部分)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)