精华内容
下载资源
问答
  • 实现Serializable接口

    2016-09-19 15:43:19
    序列化是将一个实现Serializable接口的对象转化成一个字节序列(一组byte)。可以把该字节序列保存起来,以后要用这个对象时候,就能把这些byte数据恢复出来,并据此重新构建那个对象。甚至可以将该字节序列放到其他...

    Serializable接口:该接口仅仅是一个标记接口,无任何方法定义。
    当一个类实现了Serializable接口表示该类可序列化。序列化是将一个实现Serializable接口的对象转化成一个字节序列(一组byte)。可以把该字节序列保存起来,以后要用这个对象时候,就能把这些byte数据恢复出来,并据此重新构建那个对象。甚至可以将该字节序列放到其他计算机上或者通过网络传输到其他计算机上恢复,只要该计算机平台存在相应的类就可以正常恢复为原来的对象。
    即:

    1. 将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本。
    2. 按值将对象从一个应用程序域发送至另一个应用程序域。

    实现serializable接口的作用是就是可以把对象存到字节流,然后可以恢复。所以你想如果你的对象没实现序列化怎么才能进行网络传输呢,要网络传输就得转为字节流,所以在分布式应用中,你就得实现序列化,如果你不需要分布式应用,那就没那个必要实现序列化。

    展开全文
  • 项目上有很多的pojo,entity,实体类实现serializable接口: 序列化是指在对象和对象网络进行传输过程中,将对象的状态信息转换为可以存储或传输的形式的过程. 比如说上传文件. Serializable接口是启用其序列化功能的...

    项目上有很多的pojo,entity,实体类实现serializable接口:

    序列化是指在对象和对象网络进行传输过程中,将对象的状态信息转换为可以存储或传输的形式的过程.

    比如说上传文件.

    Serializable接口是启用其序列化功能的接口。实现java.io.Serializable 接口的类是可序列化的。没有实现此接口的类将不能使它们的任意状态被序列化或逆序列化。

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

     

    展开全文
  • java类需不需要实现Serializable接口 转换为json字符串 不需要实现Serializable接口 只是转换为json字符串的形式与网络打交道,那么就不需要实现Serializable接口 RPC调用 需要实现Serializable接口 一般来说如果你...

    java类需不需要实现Serializable接口

    转换为json字符串 不需要实现Serializable接口

    只是转换为json字符串的形式与网络打交道,那么就不需要实现Serializable接口

    RPC调用 需要实现Serializable接口

    一般来说如果你的对象需要网络传输或者持久化 (对象直接转换为字节的形式传输),那么就需要实现Serializable接口。比如远程方法调RPC (Remote Procedure Call) 则接口参数就一定要实现Serializable接口;

    展开全文
  • Serializable是什么,为什么要实现Serializable接口?什么是Serializable接口什么是序列化?为什么要序列化对象什么情况下需要序列化?为什么要定义serialversionUID变量序列化的使用关于serialVersionUID 一般情况...

    一般情况下,我们在定义实体类时会实现Serializable接口,例如:
    在这里插入图片描述

    什么是Serializable接口

    一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化。

    Serializable是java.io包中定义的、用于实现Java类的序列化操作而提供的一个语义级别的接口。

    Serializable序列化接口没有任何方法或者字段,只是用于标识可序列化的语义。

    实现了Serializable接口的类可以被ObjectOutputStream转换为字节流,同时也可以通过ObjectInputStream再将其解析为对象。例如,我们可以将序列化对象写入文件后,再次从文件中读取它并反序列化成对象,也就是说,可以使用表示对象及其数据的类型信息和字节在内存中重新创建对象。

    什么是序列化?

    序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

    为什么要序列化对象

    把对象转换为字节序列的过程称为对象的序列化

    把字节序列恢复为对象的过程称为对象的反序列化

    序列化对于面向对象的编程语言来说是非常重要的,因为无论什么编程语言,其底层涉及IO操作的部分还是由操作系统其帮其完成的,而底层IO操作都是以字节流的方式进行的,所以写操作都涉及将编程语言数据类型转换为字节流,而读操作则又涉及将字节流转化为编程语言类型的特定数据类型。

    什么情况下需要序列化?

    当我们需要把对象的状态信息通过网络进行传输,或者需要将对象的状态信息持久化,以便将来使用时都需要把对象进行序列化。

    那为什么还要继承Serializable。那是存储对象在存储介质中,以便在下次使用的时候,可以很快捷的重建一个副本。

    或许你会问,我在开发过程中,实体并没有实现序列化,但我同样可以将数据保存到mysql、Oracle数据库中,为什么非要序列化才能存储呢?

    我们来看看Serializable到底是什么,跟进去看一下,我们发现Serializable接口里面竟然什么都没有,只是个空接口
    在这里插入图片描述

    一个接口里面什么内容都没有,我们可以将它理解成一个标识接口。

    比如在课堂上有位学生遇到一个问题,于是举手向老师请教,这时老师帮他解答,那么这位学生的举手其实就是一个标识,自己解决不了问题请教老师帮忙解决。在Java中的这个Serializable接口其实是给jvm看的,通知jvm,我不对这个类做序列化了,你(jvm)帮我序列化就好了。

    Serializable接口就是Java提供用来进行高效率的异地共享实例对象的机制,实现这个接口即可。

    为什么要定义serialversionUID变量

    首先看一下接口里的说明:
    在这里插入图片描述
    可以发现如果我们不自定义serialversionUID,系统就会生成一个默认的serialversionUID。
    在这里插入图片描述
    从注释中我们可以看到,它强烈建议我们自己定义一个serialversionUID,因为默认生成的serialversionUID对class极其敏感,在反序列化的时候很容易抛出InvalidClassException异常。

    序列化的使用

    下面我们可以通过例子来实现将序列化的对象存储到文件,然后再将其从文件中反序列化为对象,代码示例如下:

    先定义一个序列化对象User:

      public class User implements Serializable { 
            private static final long serialVersionUID = 1L; 
         
            private String userId; 
            private String userName; 
         
            public User(String userId, String userName) { 
                this.userId = userId; 
                this.userName = userName; 
            } 
        } 
    

    然后我们编写测试类,来对该对象进行读写操作,我们先测试将该对象写入一个文件:

     public class SerializableTest { 
         
            /** 
             * 将User对象作为文本写入磁盘 
             */ 
            public static void writeObj() { 
                User user = new User("1001", "Joe"); 
                try { 
                    ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("/Users/guanliyuan/user.txt")); 
                    objectOutputStream.writeObject(user); 
                    objectOutputStream.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
         
            public static void main(String args[]) { 
                writeObj(); 
            } 
        } 
    

    运行上述代码,我们就将User对象及其携带的数据写入了文本user.txt中。

    接下来,我们继续编写测试代码,尝试将之前持久化写入user.txt文件的对象数据再次转化为Java对象,代码如下:

    public class SerializableTest {
        /**
         * 将类从文本中提取并赋值给内存中的类
         */
        public static void readObj() {
            try {
                ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("/Users/guanliyuan/user.txt"));
                try {
                    Object object = objectInputStream.readObject();
                    User user = (User) object;
                    System.out.println(user);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
        public static void main(String args[]) {
            readObj();
        }
    }
    

    通过反序列化操作,可以再次将持久化的对象字节流数据通过IO转化为Java对象,结果如下:

    cn.wudimanong.serializable.User@6f496d9f
    

    序列化与反序列化操作过程就是这么的简单。只需要将User写入到文件中,然后再从文件中进行恢复,恢复后得到的内容与之前完全一样,但是两者是不同的对象。

    关于serialVersionUID

    对于JVM来说,要进行持久化的类必须要有一个标记,只有持有这个标记JVM才允许类创建的对象可以通过其IO系统转换为字节数据,从而实现持久化,而这个标记就是Serializable接口。而在反序列化的过程中则需要使用serialVersionUID来确定由那个类来加载这个对象,所以我们在实现Serializable接口的时候,一般还会要去尽量显示地定义serialVersionUID。

    这个serialVersionUID的详细的工作机制是:在序列化的时候系统将serialVersionUID写入到序列化的文件中去,当反序列化的时候系统会先去检测文件中的serialVersionUID是否跟当前的文件的serialVersionUID是否一致,如果一直反序列化不成功,就说明当前类跟序列化后的类发生了变化,比如是成员变量的数量或者是类型发生了变化,那么在反序列化时就会发生crash,并且回报出错误:

    java.io.InvalidClassException: User; local class incompatible: stream classdesc serialVersionUID = -1451587475819212328, local class serialVersionUID = -3946714849072033140at 
    java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:699)at 
    java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1885)at 
    java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)at
    java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042)at 
    java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)at 
    java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)at 
    Main.readUser(Main.java:32)at Main.main(Main.java:10)
    

    刚开始提到了,serialVersionUID要不要指定呢?如果不指定会出现什么样的后果?如果指定了以后后边的值又代表着什么意思呢?既然系统指定了这个字段,那么肯定是有它的作用的。

    如果我们在序列化中没有显示地声明serialVersionUID,则序列化运行时将会根据该类的各个方面计算该类默认的serialVersionUID值。但是,Java官方强烈建议所有要序列化的类都显示地声明serialVersionUID字段,因为如果高度依赖于JVM默认生成serialVersionUID,可能会导致其与编译器的实现细节耦合,这样可能会导致在反序列化的过程中发生意外的InvalidClassException异常。因此,为了保证跨不同Java编译器实现的serialVersionUID值的一致,实现Serializable接口的必须显示地声明serialVersionUID字段。

    此外serialVersionUID字段地声明要尽可能使用private关键字修饰,这是因为该字段的声明只适用于声明的类,该字段作为成员变量被子类继承是没有用处的!有个特殊的地方需要注意的是,数组类是不能显示地声明serialVersionUID的,因为它们始终具有默认计算的值,不过数组类反序列化过程中也是放弃了匹配serialVersionUID值的要求。

    转自:

    https://baijiahao.baidu.com/s?id=1633305649182361563&wfr=spider&for=pc

    https://mp.weixin.qq.com/s/Zpb2OuZxJpWX2mow3qd-xg

    展开全文
  • 因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。而实际上,Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。 什么情况下需要序列化 a)当你想...
  • 1、为什么要实现serializable 接口 实现了serializable接口的类,可以被 ObjectOutputStream 转换为字节流写入文件,同时也可以被ObjectInputStream再转换为内存中的对象。 2、对象序列化用在什么场景 将内存中的...
  • java对象实现Serializable接口

    万次阅读 2014-09-03 09:37:43
    理解java对象实现Serializable接口
  • 背景 定义 java类需要实现Serializable接口的场景 为什么REST接口的对象不需要实现Serializable 参考文档 https://tech.meituan.com/2015/02/26/serialization-vs-deserialization.html ...h...
  • 工作中我们经常在进行持久化操作和返回数据时都会使用到javabean来统一封装参数,方便操作,一般我们也都会实现Serializable接口,那么问题来了,首先:为什么要进行序列化;其次:每个实体bean都必须实现...
  • ###java 序列化为什么要实现Serializable接口 ####什么是java序列化 1.java序列化是将对象写入字节流,将对象换成字节的表现形式 ####java实现序列化的意义 1.序列化之后的java对象,可以以字节流形式用于数据持久化...
  • java中类实现Serializable接口的原因
  • 工作中我们经常在进行持久化操作和返回数据时都会使用到javabean来统一封装参数,方便操作,一般我们也都会实现Serializable接口,那么问题来了,首先:为什么要进行序列化;其次:每个实体bean都必须实现...
  • 为什么要实现Serializable接口

    千次阅读 2019-04-15 14:00:58
    因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。 而实际上,Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。 什么情况下需要序列化? a)当...
  • 最近公司的在做服务化, 需要把所有model包里的类都实现Serializable接口, 同时还要显示指定serialVersionUID的值. 听到这个需求, 我脑海里就突然出现了好几个问题, 比如说: (1) 序列化和反序列化是什么? (2) 实现...
  • 一般来说如果你的对象需要网络传输或者持久化(对象直接转换为字节的形式传输),那么就需要实现Serializable接口。 如果只是转换为字符串的形式与网络打交道,那么就不需要实现Serializable接口。 ...
  • 什么是Serializable接口? 一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的。...实现serializable接口的作用是就是可以把对象存到字节流,然后可以恢复。所以你想如果你的
  •  实现serializable接口的作用是就是可以把对象存到字节流,然后可以恢复。所以你想如果你的对象没实现序列化怎么才能进行网络传输呢,要网络传输就得转为字节流,所以在分布式应用中,你就得实现序列化,如果你不...
  • 在Java编程中我们会看到源码中或者别人代码中很多实体Bean都实现了Serializable接口,但是我很多实体在使用中并没有序列化也能...由此引发了我的疑问,到底需不要实现Serializable接口?答案是必要,请由我娓娓道来。
  • Idea中类实现Serializable接口

    千次阅读 2017-12-28 15:36:54
    idea实现Serializable接口,然后打出serialVersionUID的办法 setting>editor>Inspection>Java>Serialization issues>勾上Serializable class without “serialVersion” 的框
  • 为什么bean要实现Serializable接口
  • 在学习序列化的时候产生的问题,Serializable接口是一个空接口,那为什么实现Serializable接口就能序列化呢? 序列化主要是通过ObjectOutputSteam中的writeObject方法。在writeObject方法中会判断对象是否是...
  • 【java】java实体类为什么要实现Serializable接口1. 什么是Serializable接口2. 什么是序列化3. 为什么要序列化对象4. 什么情况下需要序列化5. 为什么要定义serialversionUID变量 最近看了看大佬写的代码发现,在实体...
  • java对象实现Serializable接口(整理)

    千次阅读 2017-11-14 11:03:22
    在还没有深入了解serializable接口之前,像很多程序员一样,以为一个对象实现serializable接口就被序列化了。 最近在接触ehcache缓存的时候,将对象缓存起来,该对象需要先实现Serializable接口,然而,我们会...
  • mac下idea中类实现Serializable接口

    千次阅读 2018-01-30 14:13:44
    mac下idea中类实现Serializable接口,自动生成serialVersionUID 1.步骤 :file-->settings-->inspections-->serialization issues-->勾选serializable calss without "serialVersionUID" 2.在创建类的时候实现...
  • java实现serializable接口的作用

    千次阅读 2017-05-31 22:02:36
    因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。而实际上,Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。 Serialize 是什么?这是IO存储中的...
  • java pojo 层实现 Serializable接口有什么意义?
  • 谈谈序列化—实体bean一定要实现Serializable接口

    万次阅读 多人点赞 2017-03-13 17:38:27
    所以在之后就将参数传递和返回类型全都改成了实体bean,并且让每个bean都实现Serializable接口。然后,在这里的时候,就有点疑惑。首先:为什么要进行序列化;其次:每个实体bean都必须实现serializabel接口吗?...
  • 文章目录1、方式一(实现Serializable接口,通过序列化流)2、方式二 (实现Externalizable接口,重写writeExternal和readExternal方法) 对象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象。对象...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 179,214
精华内容 71,685
关键字:

怎么实现serializable接口