精华内容
下载资源
问答
  • 文章来源 版权声明:本文为CSDN博主「Be a good programmer」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接...1.一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做持久。 2.对象的...

    文章来源

    版权声明:本文为CSDN博主「Be a good programmer」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/xiaoxinxin123456789/article/details/83545946

    一、java中实现序列化接口的意义

    1.一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做持久化

    2.对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的的值。

    3.序列化能把堆内存中的对象的声明周期延长,做持久化操作,当下次再需要这个对象的时候,我们不用new了,直接从硬盘中读取就可以了(存储到硬盘上的是一个文件,不需要我们再去解析了,如果用记事本打开解析会出现乱码,解析要用特定的方式,不用我们管,我们只能需要读取)。把对象存储在硬盘上的一个文件中国,这个文件的扩展名是(.object)

    4.在搞web开发的时候一些类就需要实现序列化接口,因为服务器就会对你的对象进行临时本地存储,他怕服务器崩了的以后,你的会话都消失了,所以存储在硬盘上,你重新启动服务器会恢复之前的会话,回复对象,你之前运行的东西还会在。


    二、JDK类库中的序列化API

    java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

    java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

    只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为。

    而仅实现Serializable接口的类可以 采用默认的序列化方式 。

    对象序列化包括如下步骤:

    1. 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;
    2. 通过对象输出流的writeObject()方法写对象。

    对象反序列化的步骤如下:

    1. 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;
    2. 通过对象输入流的readObject()方法读取对象。

    三、Github代码地址

    https://github.com/DemoTransfer/demotransfer/blob/master/java/serializable/DeepCopyTest

    展开全文
  • 实体类是没必须实现序列化接口的,实现的话可以用于通信之类的。 因为公司用的是JSON所以没有必要 protostuff 来完成java的序列化和反序列化? 2. 序列化的目的 为了保存在内存中的各种对象的状态(也就是实例...

    1. 序言

    实体类是没必须实现序列化接口的,实现的话可以用于通信之类的。

    因为公司用的是JSON所以没有必要

    protostuff 来完成java的序列化和反序列化?

    2. 序列化的目的

    为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来,这是java中的提供的保存对象状态的机制—序列化。

    2.1 场景:
      1、当想把的内存中的对象状态保存到一个文件中或者数据库中表(内存到数据库)
      2、当想用套接字在网络上传送对象(网络传输)(或者不同线程之间通讯)
      3、当想通过RMI传输对象的时候(分布式传输)

    3. java实现Serializable接口

    public interface Serializable {
    }
    其实并没有需要去实现的方法,相当于一个标识,可以被序列化。

    一个java中的类只有实现了Serializable接口,它的对象才是可序列化的。

    4. serialVersionUID 

    serialVersionUID的取值是Java运行时环境根据类的内部细节自动生成的。如果对类的源代码作了修改,再重新编译,新生成的类文件的serialVersionUID的取值有可能也会发生变化。

    类的serialVersionUID的默认值完全依赖于Java编译器的实现,对于同一个类,用不同的Java编译器编译,有可能会导致不同的serialVersionUID,也有可能相同。为了提高serialVersionUID的独立性和确定性,强烈建议在一个可序列化类中显示的定义serialVersionUID,为它赋予明确的值。
     

    显式地定义serialVersionUID有两种用途: 
      a. 在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID; 
      b. 在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。

    4.1 private static final long serialVersionUID = 1L; 的意义
    语句本身可能就是显示指定了UID的值,但是为什么看项目中都是给定了1L呢?

    首先,不给定的话因为不同的JVM之间的序列化算法是不一样的,不同的JDK也可能不一样,不利于程序的移植,可能会让反序列化失败。

    实现java.io.Serializable这个接口是为序列化,serialVersionUID 用来表明实现序列化类的不同版本间的兼容性。如果你修改了此类, 要修改此值。否则以前用老版本的类序列化的类恢复时会出错。

     

    但是为什么好多都给定的是1呢?

    你可以随便写一个,在Eclipse中它替你生成一个,有两种生成方式: 一个是默认的1L,比如:private static final long serialVersionUID = 1L; 一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:private static final long serialVersionUID = -8940196742313994740L;之类的。

    5. 为什么保存到文件中要序列化

            当我们想把的内存中的对象状态保存到一个文件中或者数据库中时候,Serializable接口能帮我们做些什么?

      如上所述,读写对象会有什么问题呢?比如:我要将对象写入一个磁盘文件而后再将其读出来会有什么问题吗?别急,其中一个最大的问题就是对象引用!举个例子来说:假如我有两个类,分别是A和B,B类中含有一个指向A类对象的引用,现在我们对两个类进行实例化{ A a = new A(); B b = new B(); },这时在内存中实际上分配了两个空间,一个存储对象a,一个存储对象b,接下来我们想将它们写入到磁盘的一个文件中去,就在写入文件时出现了问题!因为对象b包含对对象a的引用,所以系统会自动的将a的数据复制一份到b中,这样的话当我们从文件中恢复对象时(也就是重新加载到内存中)时,内存分配了三个空间,而对象a同时在内存中存在两份,想一想后果吧,如果我想修改对象a的数据的话,那不是还要搜索它的每一份拷贝来达到对象数据的一致性,这不是我们所希望的!

       以下序列化机制的解决方案:

      1.保存到磁盘的所有对象都获得一个序列号(1, 2, 3等等)

      2.当要保存一个对象时,先检查该对象是否被保存了。

      3.如果以前保存过,只需写入"与已经保存的具有序列号x的对象相同"的标记,否则,保存该对象通过以上的步骤序列化机制解决了对象引用的问题!

      在对对象进行实例化的过程中相关注意事项
      a)序列化时,只对对象的状态进行保存,而不管对象的方法;
      b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
      c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
      d)并非所有的对象都可以序列化,至于为什么不可以,有很多原因了,比如:
      1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行RMI传输  等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。
      2. 资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分配,而且,也是没有必要这样实现。
    ————————————————
    参考:https://blog.csdn.net/pmdream/article/details/90175448

    展开全文
  • Java如何实现序列化,有什么意义?

    万次阅读 多人点赞 2018-04-24 21:16:40
    1.实现序列化:1)让类实现Serializable接口,该接口是一个标志性接口,标注该类对象是可被序列2)然后使用一个输出流来构造一个对象输出流并通过writeObect(Obejct)方法就可以将实现对象写出3)如果需要反序列化,则可以用...

    1.实现序列化:

    1)让类实现Serializable接口,该接口是一个标志性接口,标注该类对象是可被序列

    2)然后使用一个输出流来构造一个对象输出流并通过writeObect(Obejct)方法就可以将实现对象写出

    3)如果需要反序列化,则可以用一个输入流建立对象输入流,然后通过readObeject方法从流中读取对象


    2.作用:

    1)序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,可以对流化后的对象进行读写操作,也可以将流化后的对象传输与网络之间;

    2)为了解决对象流读写操作时可能引发的问题(如果不进行序列化,可能会存在数据乱序的问题)

    3)序列化除了能够实现对象的持久化之外,还能够用于对象的深度克隆


    上面说的很抽象,接下来看例子 具体点:

     第一步:创建一个 JavaBean 对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public  class  Person  implements  Serializable{
         private  String name;
         private  int  age;
         
         public  String getName() {
             return  name;
         }
         public  void  setName(String name) {
             this .name = name;
         }
         public  int  getAge() {
             return  age;
         }
         public  void  setAge( int  age) {
             this .age = age;
         }
         @Override
         public  String toString() {
             return  "Person [name="  + name +  ", age="  + age +  "]" ;
         }
         public  Person(String name,  int  age) {
             super ();
             this .name = name;
             this .age = age;
         }
    }  

     

     第二步:使用 ObjectOutputStream 对象实现序列化

    1
    2
    3
    4
    5
    6
    //在根目录下新建一个 io 的文件夹
             OutputStream op =  new  FileOutputStream( "io" +File.separator+ "a.txt" );
             ObjectOutputStream ops =  new  ObjectOutputStream(op);
             ops.writeObject( new  Person( "vae" , 1 ));
             
             ops.close();

      我们打开 a.txt 文件,发现里面的内容乱码,注意这不需要我们来看懂,这是二进制文件,计算机能读懂就行了。

    错误一:如果新建的 Person 对象没有实现 Serializable 接口,那么上面的操作会报错:

        

    第三步:使用ObjectInputStream 对象实现反序列化

      反序列化的对象必须要提供该对象的字节码文件.class

    1
    2
    3
    4
    5
    6
    7
    InputStream in =  new  FileInputStream( "io" +File.separator+ "a.txt" );
             ObjectInputStream os =  new  ObjectInputStream(in);
             byte [] buffer =  new  byte [ 10 ];
             int  len = - 1 ;
             Person p = (Person) os.readObject();
             System.out.println(p);   //Person [name=vae, age=1]
             os.close();

      

    问题1:如果某些数据不需要做序列化,比如密码,比如上面的年龄?

    解决办法:在字段面前加上 transient

    1
    2
    private  String name; //需要序列化
         transient  private  int  age; //不需要序列化

      那么我们在反序列化的时候,打印出来的就是Person [name=vae, age=0],整型数据默认值为 0 

     

    问题2:序列化版本问题,在完成序列化操作后,由于项目的升级或修改,可能我们会对序列化对象进行修改,比如增加某个字段,那么我们在进行反序列化就会报错:

     

     

    解决办法:在 JavaBean 对象中增加一个 serialVersionUID 字段,用来固定这个版本,无论我们怎么修改,版本都是一致的,就能进行反序列化了

    1
    private  static  final  long  serialVersionUID = 8656128222714547171L;

      

    博客部分资源来源于:https://www.cnblogs.com/ysocean/p/6870069.html


    展开全文
  • 这样子,任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送 到别的地方。也可以用管道来传输到系统的其他程序中。这样子极大的简化了类的设计。只要设计一个保存一个读取功能...
      **所谓的Serializable,就是java提供的通用数据保存和读取的接口。至于从什么地方读出来和保存到哪里
    

    去都被隐藏在函数参数的背后了。这样子,任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送
    到别的地方。也可以用管道来传输到系统的其他程序中。这样子极大的简化了类的设计。只要设计一个保存一个读取功能就能解决上面说得
    所有问题。
    java的"对象序列化"能让你将一个实现了Serializable接口的对象转换成一组byte,这样日后要用这个对象时候,你就能把这些byte数
    据恢复出来,并据此重新构建那个对象了。
    工作流当中流程变量的几种数据类型:string integer short long double boolean date binary serializable,这就是为什么要将
    javabean实现序列化的原因,因为你将对象设置到流程变量中必须要实现序列化,否则会在设置流程变量的时候报错找不到该类型
    java对象序列化机制就是把内存中的Java对象(User之类的JavaBean)转换成二进制流。java对象序列化后可以很方便的存储或者在网络
    中传输。Java的序列化机制是通过运行时判断类的序列化ID(serialVersionUID)来判定版本的一致性。在反序列化时,java虚拟机会通过二
    进制流中的serialVersionUID与本地的对应的实体类进行比较,如果相同就认为是一致的,可以进行反序列化,正确获得信息,否则抛出序列
    化版本不一致的异常。所以涉及到数据传输或者存储的类,严格意义上来说都要加上序列化ID,这也是一种良好的编程习惯。**

    展开全文
  • java实体类实现序列化意义

    千次阅读 2016-04-29 17:17:30
    1 序列化意义客户端访问了某个能开启会话功能的资源, web服务器就会创建一个与该客户端对应的HttpSession对象,每个HttpSession对象都要站用一定的内存空间。如果在某一时间段内访问站点的用户很多,web服务器...
  • Java序列化实现原理研究

    万次阅读 多人点赞 2018-05-31 17:25:39
    1.什么是序列化和反序列化 序列化 是指将Java对象保存为二进制字节码的过程。 反序列化 将二进制字节码重新转成Java对象的过程。 2.为什么序列化 我们知道,一般Java对象的生命周期比Java...
  • Java实现序列化接口意义是什么?

    千次阅读 2019-03-23 15:26:12
    实现Serializable接口的作用就是可以序列化,将对象存到字节流,然后可以恢复(Java的“对象的序列化”能让你将一个实现了Serializable接口的对象转换成一组byte,这样以后要用这个对象的时候你就能把这些byte的数据...
  • 分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!... 序列化是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。...要实现序列化,需...
  • pojo类实现序列化接口的应用场景

    千次阅读 2017-11-09 18:16:50
    每次写博客的时候都会想的很多。生活中的琐碎事情,职业道路上攒动... 唔,当然,这是一篇技术性博客,开门的个人碎念到此结束,下面开始进入正题---序列化: 1.什么是序列化?  从字面上理解就是有序,标准而整齐。
  • Java实现序列化:Java的对象可以通过实现Serializable接口实现序列化。它是一个标记接口,意味着它不包含任何方法或字段,仅用于标识可序列化的语义。 如果我们想序列化一段不可序列化的字符串时我们将得到一个 ...
  • 遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题a,什么叫序列化和反序列化 b,作用。为啥要实现这个 Serializable 接口,也就是为啥要序列化 c,serialVersionUID 这个的值到底是在怎么设置的...
  • 意义:序列化机制允许将实现序列化Java对象转换为字节序列,并将字节序列保存在磁盘中,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使地对象可以脱离程序的运行而独立存在。 使用场景:所有在网络上...
  • java实现序列化的作用

    千次阅读 2017-03-09 15:58:23
    序列化作用
  • JAVA序列化与反序列化意义

    千次阅读 2018-11-30 13:52:29
    Java序列化意义:  1、将对象或者异常等写入文件,通过文件传输信息。  2、将对象或者异常通过网络进行传输。  3、把内存中的对象状态保存到一个文件中或者数据库中时。  序列化可以通过实现Serializable ...
  • java序列化意义以及实现方法

    千次阅读 2017-02-20 22:49:21
    理解Java对象序列化 关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结。此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制。在撰写本文时,既...
  • Java中为什么实体类需要实现序列化

    千次阅读 2017-07-14 19:53:11
    一、什么是Java对象序列化 Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输,一般当我们使用...
  • 遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题a,什么叫序列化和反序列化 b,作用。为啥要实现这个 Serializable 接口,也就是为啥要序列化 c,serialVersionUID 这个的值到底是在怎么设置的...
  • Java知识体系最强总结(2021版)

    万次阅读 多人点赞 2019-12-18 10:09:56
    本人从事Java开发已多年,平时有记录问题解决方案和总结知识点的习惯,整理了一些有关Java的知识体系,这不是最终版,会不定期的更新。也算是记录自己在从事编程工作的成长足迹,通过博客可以促进博主与阅读者的共同...
  • java的对象流(序列化与反序列化)

    千次阅读 2017-06-27 13:57:22
    1.序列化和反序列化 序 列 化:指把堆内存中的Java对象数据,...反序列化:把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象的过程. 为什么要做序列化:  1):在分布式系统中,需要共享的数据的JavaB
  • Serializable接口是一个里面什么都没有的接口 它的源代码是public interface Serializable{},即什么都没有。 如果一个接口里面什么内容都没有,那么这个接口是一个标识接口,比如,一个学生遇到一个问题,排错...
  • 为什么不能轻易的实现序列化(implements Serializable) 摘自《Effective Java》`第11章 序列化本章关注对象的序列化(object serialization)API,它提供了一个框架,用来将对象编码成字节流,以及从字节流编码中...
  • 首先,序列化是干什么的,有什么作用,什么情况下会用到? 1,系列化是干什么的? 序列化简单来说就保存对象在内存中的状态也可以说是实例化变量。...只有实现了serializable接口的类的对象才能被实例化...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 60,281
精华内容 24,112
关键字:

java实现序列化接口的意义

java 订阅