网上有很多对Serializable(百度翻译:可串行化的)的解释,
这是网上给出的三个需要进行序列化的地方:
a)当你想把的内存中的 对象状态(这四个字划重点) 保存到一个文件中或者数据库中时候;
b)当你想用套接字(socket)在网络上传送对象的时候;
c)当你想通过RMI(远程调用方法,说白了就是在一台服务器运行的代码里面调用只存在于另一台服务器上某个对象的方法)传输对象的时候;
我的理解:
在java代码中我们会创建很多个实体类.
例如创建一个实体类, 类名为: Test
Test test = new Test();
接着我们肯定在某个地方会用到它.这时候可能会进行一些赋值操作:
test .setAge("16");
test .setName("sila");
往后的代码里我们就可以开始使用这个对象了.
这里就出现了一个点: 我们能使用对象,是因为服务器 (A) 的JVM将创建出来的对象存储到了开辟出的堆栈空间.我们能拿能用,是因为在代码运行的虚拟机空间中有了这个对象!
以下开始进行具体举例:
问题 1 :
如果我另一台服务器B中运行的代码里面也需要 Test 对象,并需要调用它里面的某些方法呢?
限定:
1. 只需要在A服务器上的 Test 对象,而不是说重新创建.
2. 也不是通过URL连接A服务器调用某一个方法之后得到.就只是运行到某一行代码时候需要用到它了!
Test 对象存在于A服务器的虚拟机中, 而不存于B服务器的虚拟机开辟出的内存空间里面.
这时候如果B服务器需要它------Serializable的作用就出现了.
你可以在A服务器运行的代码里,让 Test类 implements Serializable, 并用java提供给我们的具体方法, 将这个可以串行化的对象通过网络传输发送给B服务器.
然后在B服务器上的代码里通过java提供的反序列化具体方法拿到这个传送过来的对象,在B本地进行还原(即在它本地空间中创建出这个对象,值也一并带过来了).
问题2: 单机游戏如何存档?(由于我本人没进行过游戏开发,这里只是基于Serializable进行下猜测说明)
游戏在运行的时候, 从编程角度来讲,实际上就是代码在运行, 玩家存档这个动作怎么实现呢?
这时候就可以将存档前运行的数据保存到你指定的某一个本地文件中, 如果是对象 - 就是所谓的序列化到本地文件中.之后再开始游戏的时候,就是从本地的某一特定文件中读取数据,也就是反序列化对象.
像很多普通的网站几乎不会存在需要用到对象序列化的地方, 每次的增删改查几乎都是对同一台服务器上运行的项目中的某一个方法进行调用而已. 创建的对象一直在这台机器的JVM虚拟机内存空间中, 也不会需要进行类似于存档的操作. 所以几乎都感受不到它.
简单记录记录....