在用Java做《小小五子棋》这个项目案例时遇到的Serializable。

Serializable的作用:

  序列化技术准备用于序列化的对象必须设置 [System.Serializable] 标签,该标签指示一个类能够序列化。便于在网络中传输和保存 这个标签是类能够被序列化的特性,表示这个类能够被序列化。

序列化定义:  对象被临时保存在内存中,想要用介质转移对象并且把对象的状态保存下来,就必须把对象保存下来,这个过程被称为序列化。与之相对的是反序列化。

序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包含类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象全然同样的副本。

在面向对象的环境中实现序列化机制时,必须在易用性和灵活性之间进行一些权衡。仅仅要您对此过程有足够的控制能力,就能够使该过程在非常大程度上自己主动进行。比如,简单的二进制序列化不能满足须要,或者,因为特定原因须要确定类中那些字段须要序列化。下面各部分将探讨 .NET 框架提供的可靠的序列化机制,并着重介绍使您能够依据须要自己定义序列化过程的一些重要功能。

持久存储
我们常常须要将对象的字段值保存到磁盘中,并在以后检索此数据。虽然不使用序列化也能完毕这项工作,但这样的方法通常非常繁琐并且easy出错,并且在须要跟踪对象的层次结构时,会变得越来越复杂。能够想象一下编写包括大量对象的大型业务应用程序的情形,程序猿不得不为每个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。

公共语言执行时 (CLR) 管理对象在内存中的分布,.NET 框架则通过使用反射提供自己主动的序列化机制。对象序列化后,类的名称、程序集以及类实例的全部数据成员均被写入存储媒体中。对象通经常使用成员变量来存储对其它实例的引用。类序列化后,序列化引擎将跟踪全部已序列化的引用对象,以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构能够自己主动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的全部对象都必须标记为 Serializable(请參阅基本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。

当反序列化已序列化的类时,将又一次创建该类,并自己主动还原全部数据成员的值。

按值封送
对象仅在创建对象的应用程序域中有效。除非对象是从 MarshalByRefObject 派生得到或标记为 Serializable,否则,不论什么将对象作为參数传递或将其作为结果返回的尝试都将失败。假设对象标记为 Serializable,则该对象将被自己主动序列化,并从一个应用程序域传输至还有一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对象的一个精确副本。此过程通常称为按值封送。

假设对象是从 MarshalByRefObject 派生得到,则从一个应用程序域传递至还有一个应用程序域的是对象引用,而不是对象本身。也能够将从 MarshalByRefObject 派生得到的对象标记为 Serializable。远程使用此对象时,负责进行序列化并已预先配置为 SurrogateSelector 的格式化程序将控制序列化过程,并用一个代理替换全部从 MarshalByRefObject 派生得到的对象。假设没有预先配置为 SurrogateSelector,序列化体系结构将遵从以下的标准序列化规则(请參阅序列化过程的步骤)。

序列化规则
因为类编译后便无法序列化,所以在设计新类时应考虑序列化。须要考虑的问题有:是否必须跨应用程序域来发送此类?是否要远程使用此类?用户将怎样使用此类?或许他们会从我的类中派生出一个须要序列化的新类。仅仅要有这样的可能性,就应将类标记为可序列化。除下列情况以外,最好将全部类都标记为可序列化:

全部的类都永远也不会跨越应用程序域。假设某个类不要求序列化但须要跨越应用程序域,请从 MarshalByRefObject 派生此类。
类存储仅适用于其当前实例的特殊指针。比如,假设某个类包括非受控的内存或文件句柄,请确保将这些字段标记为 NonSerialized 或根本不序列化此类。
某些数据成员包括敏感信息。在这样的情况下,建议实现 ISerializable 并仅序列化所要求的字段。

转载于:https://www.cnblogs.com/zzl1218/p/10305405.html

Serializable作用相关推荐

  1. Unity基础篇:Serializable总结与深入研究。

    [HideInInspector]表示将原本显示在面板上的序列化值隐藏起来.  [SerializeField]表示将原本不会被序列化的私有变量和保护变量变成可以被序列化的,那么它们在下次读取的值就是 ...

  2. Serializable

    Serializable 一般情况下,我们在定义实体类时会继承Serializable接口.并且会定义serialversionUID(如果我们没有自己声明一个serialVersionUID变量,接 ...

  3. java serializable用法_Serializable序列化用法

    在学习mybatis中缓存部分有提到序列化这一词,探索一下什么时候应该实现序列化接口,而什么时候可以不实现序列化接口 1. Serializable作用是是实现将后台数据对象转化为字节流传输,一种用来 ...

  4. 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  5. 团队项目--设计类图

    团队项目-设计类图 负责人:董光耀 杨文雅 一.整体方案的制定 聊天工具的系统运行图 二.数据表设计 本聊天工具建立的数据库中各个表的设计结果如下面表格所示.每个表格表示数据库中的一个表. (1) 用 ...

  6. 复习专栏之---面试总结

    文章目录 1. String类能不能被继承 2. spring如何解决循环依赖? 3. 简述Java的反射机制和使用场景 4. String str = new String("abc&qu ...

  7. Unity Serialize总结

    [HideInInspector]表示将原本显示在面板上的序列化值隐藏起来. [SerializeField]表示将原本不会被序列化的私有变量和保护变量变成可以被序列化的,那么它们在下次读取的值就是你 ...

  8. Java实现QQ附源码

    /** 1,程序原理 Swing+事件监听+多线程+Socket通信 swing绘制界面; 事件监听:监听键盘和鼠标事件,用户操作鼠标或者键盘后就会触发绑定的代码; 多线程实现多个通信链接的处理; S ...

  9. java基础---serializable的作用

    首先这个接口不提供方法.调用这个接口表示能够序列化. serializable接口的作用,可序列化成字节码保存对象状态用于网络传输,使用一个64位hash码来维护类的版本一致.transient和st ...

  10. Serializable的作用

    前两天接触到VO,DTO,entity这些概念,发现别人的代码中会有 implements serializable这个东西,之前并没有见过这种写法,就去了解了一下原因 import java.io. ...

最新文章

  1. python入门教程非常详细-Python 基础教程
  2. Go Web学习(2)——实现中间件(middleware)
  3. java.lang.Runtime
  4. (RabbitMQ) Java Client API Guide
  5. Flutter RichText支持自定义文字背景
  6. GitHub推出包管理服务,npm与Nuget全支持
  7. java 8 集合分组_Java 8:按集合分组
  8. 深度学习中 epoch,[batch size], iterations概念解释
  9. mysql warning 1618_MySQL - 错误1045 - 拒绝访问
  10. Python使用wordcloud+pillow基于给定图像制作词云
  11. python mysql connector
  12. 如何在Linux下加载移动硬盘和光驱
  13. 安卓仿苹果键盘输入法_苹果手机键盘背景图 安卓仿iphone输入法
  14. 【双十一精选】史上最强的宝贝详情页设计思路以及操作流程
  15. erdas2015几何校正模块在哪_什么是几何校正和正射校正还有怎样用erdas做几何校正...
  16. 微信小程序audio的简单实用
  17. GitLab服务更换ip后项目地址ip如何修改
  18. 八:微服务调用组件Dubbo
  19. 绘图软件教程(2)coreldraw12图层的使用与DXF文件的导出
  20. 使用命令行打开应用程序

热门文章

  1. 开发基于大数据平台的搜索引擎
  2. 解决 placeholder 垂直不居中,偏上的问题
  3. 给做技术的换一道菜尝尝:一月冲皇冠?凶残级淘宝店主,无法阻挡的爆款名城!...
  4. 乱谈B2C系统-算是今年的总结吧
  5. Memcached在Windows7上的安装问题
  6. C++ 调用批处理命令或者.bat(.cmd)文件或者.exe文件
  7. C 标准库中输出到字符串、到文件的相关函数
  8. 3842开关电源完整原理图_开关电源的电路看不懂怎么办?看完本篇就简单了
  9. zookeeper分布式安装与配置
  10. pythonsqlite导出json_使用python将mysql数据库的数据转换为json数据