精华内容
下载资源
问答
  • 【Android】Android中Serializable接口定义和使用 1、序列化是干什么的?  简单说就是为了保存内存的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以...

    【Android】Android中Serializable接口的定义和使用

    1、序列化是干什么的?

           简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。

    2、什么情况下需要序列化   
        a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
        b)当你想用套接字在网络上传送对象的时候;
        c)当你想通过RMI传输对象的时候;

    3、Parcelable和Serializable的区别:

    内存间数据传输时推荐使用Parcelable,如activity间传输数据

    保存到本地或者网络传输时推荐使用Serializable

     

    serialVersionUID 用来表明类的不同版本间的兼容性。

    有两种生成方式: 一个是默认的1L;另一种是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段 。

    java类中为什么需要重载 serialVersionUID 属性。 
    当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。 把Java对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为Java对象的过程称为对象的反序列化。 

    ========================================

    SerializableDemo:MainActivity.java通过Serializable接口保存数据并跳转到FirstActivity.java,在FirstActivity.java中读取数据。

    Person类

    复制代码
    package com.example.serializetest;
    
    import java.io.Serializable;
    public class Person implements Serializable{
        
        private static final long serialVersionUID = 1L;
        // 成员变量
        private int id;
        private String name;
        
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
       
    }
    复制代码

    MainActivity.java

    复制代码
             // 封装数据
            Person p = new Person();
            p.setId(320840);
            p.setName("小伙子");
            Intent i = new Intent(MainActivity.this, FirstActivity.class);
            i.putExtra("Person", p);
            startActivity(i);    
    复制代码

    FirstActivity.java

           Person p = (Person)getIntent().getSerializableExtra("Person");       
           System.out.println("身份证"+p.getId());
           System.out.println("姓名"+p.getName());    

     下载地址:http://download.csdn.net/detail/xubuhang/8695671

      其他例子:http://www.tuicool.com/articles/2ymUVn

      传递List<Object>传递List<Object>的方法:http://blog.csdn.net/wirelessqa/article/details/8589200

    作者:xubuhang  出处 :  http://www.cnblogs.com/xubuhang/p/4500479.html

    写的简单明了,向作者 xubuhang 致谢!

    展开全文
  • Serializable接口

    2019-12-12 13:25:05
    Serializable接口概述 Serializable是java.io包中定义的、用于实现Java类的序列化操作而提供的一个语义级别的接口。Serializable序列化接口没有任何方法或者字段,只是用于标识可序列化的语义。实现了Serializable...

    Serializable接口概述

    Serializable是java.io包中定义的、用于实现Java类的序列化操作而提供的一个语义级别的接口。Serializable序列化接口没有任何方法或者字段,只是用于标识可序列化的语义。实现了Serializable接口的类可以被ObjectOutputStream转换为字节流,同时也可以通过ObjectInputStream再将其解析为对象。例如,我们可以将序列化对象写入文件后,再次从文件中读取它并反序列化成对象,也就是说,可以使用表示对象及其数据的类型信息和字节在内存中重新创建对象。
    而这一点对于面向对象的编程语言来说是非常重要的,因为无论什么编程语言,其底层涉及IO操作的部分还是由操作系统其帮其完成的,而底层IO操作都是以字节流的方式进行的,所以写操作都涉及将编程语言数据类型转换为字节流,而读操作则又涉及将字节流转化为编程语言类型的特定数据类型。而Java作为一门面向对象的编程语言,对象作为其主要数据的类型载体,为了完成对象数据的读写操作,也就需要一种方式来让JVM知道在进行IO操作时如何将对象数据转换为字节流,以及如何将字节流数据转换为特定的对象,而Serializable接口就承担了这样一个角色。

    简单的说:Serializable是Java提供的序列化接口,是一个空接口,为对象提供标准的序列化与反序列化操作。使用Serializable实现序列化过程相当简单,只需要在类声明的时候指定一个标识,便可以自动的实现默认的序列化过程。

    下面我们来演示模拟一下

    先定义一个序列化对象User:
    在这里插入图片描述
    编写测试类
    在这里插入图片描述
    运行上述代码,我们就将User对象及其携带的数据写入了文本user.txt中
    在这里插入图片描述
    可能这样看不出来Serializable接口的作用,现在我们把User进行修改,不继承Serializable接口
    在这里插入图片描述
    再次运行测试类
    在这里插入图片描述
    结果不出所料,抛出了NotSerializableException异常,提示非可序列化异常,也就是说没有实现Serializable接口的对象是无法通过IO操作持久化的。

    接下来,我们继续编写测试代码,尝试将之前持久化写入user.txt文件的对象数据再次转化为Java对象,代码如下:
    在这里插入图片描述
    运行结果如下:

    hsy.Serializable.service.User@6f496d9f 
    

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

    Serializable接口就是这么简单!!

    下面说点细节问题:
    关于serialVersionUID

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

    private static final long serialVersionUID = 1L; 
    

    在反序列化的过程中,如果接收方为对象加载了一个类,如果该对象的serialVersionUID与对应持久化时的类不同,那么反序列化的过程中将会导致InvalidClassException异常。例如,在之前反序列化的例子中,我们故意将User类的serialVersionUID改为2L,如:

    private static final long serialVersionUID = 2L; 
    

    运行测试出现如下异常:

    java.io.InvalidClassException: hsy.Serializable.service.User; local class 
    incompatible: stream classdesc serialVersionUID = 1, local class 
    serialVersionUID = 2     
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:687)     
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1880)     
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1746)     
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2037)     
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1568)     
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:428)     
    athsy.Serializable.Test.SerializableTest.readObj(SerializableTest.java:31)     
    at hsy.Serializable.Test.SerializableTest.main(SerializableTest.java:44) 
    

    如果我们在序列化中没有显示地声明serialVersionUID,则序列化运行时将会根据该类的各个方面计算该类默认的serialVersionUID值。但是,Java官方强烈建议所有要序列化的类都显示地声明serialVersionUID字段,因为如果高度依赖于JVM默认生成serialVersionUID,可能会导致其与编译器的实现细节耦合,这样可能会导致在反序列化的过程中发生意外的InvalidClassException异常。因此,为了保证跨不同Java编译器实现的serialVersionUID值的一致,实现Serializable接口的必须显示地声明serialVersionUID字段。
    此外serialVersionUID字段地声明要尽可能使用private关键字修饰,这是因为该字段的声明只适用于声明的类,该字段作为成员变量被子类继承是没有用处的!有个特殊的地方需要注意的是,数组类是不能显示地声明serialVersionUID的,因为它们始终具有默认计算的值,不过数组类反序列化过程中也是放弃了匹配serialVersionUID值的要求。

    序列化与反序列化

    序列化是指把对象转换为字节序列的过程,我们称之为对象的序列化,就是把内存中的这些对象变成一连串的字节(bytes)描述的过程。

    而反序列化则相反,就是把持久化的字节文件数据恢复为对象的过程。

    需要序列化的常见情境:

    1)、需要把内存中的对象状态数据保存到一个文件或者数据库中的时候,这个场景是比较常见的,例如我们利用mybatis框架编写持久层insert对象数据到数据库中时;
    2)、网络通信时需要用套接字在网络中传送对象时,如我们使用RPC协议进行网络通信时;

    展开全文
  • JavaSerializable接口

    2020-03-15 22:05:43
    Serializable接口定义: public interface Serializable { } 该接口没有任何属性和方法,这样的接口称为标识接口。 标识接口:只是起标识作用,而不解决实际问题,实际问题交给其他机制处理。如上课的时候,学生...

    Serializable

    Serializable接口的定义:

    public interface Serializable {
    }
    

    该接口没有任何属性和方法,这样的接口称为标识接口
    标识接口:只是起标识作用,而不解决实际问题,实际问题交给其他机制处理。如上课的时候,学生举手问老师问题,老师帮他解答,其实学生举手就是一个标识,说明自己无法解决某个问题,请求帮助。Java中的Serializable接口就是通知JVM,让JVM完成序列化的整个操作。

    什么是序列化

    序列化就是将对象状态转换为可保存或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。

    什么情况下需要序列化

    一般,我们写的实体类都需要实现Serializable接口。
    当我们需要把对象在网络间进行传输,或者需要持久化对象的时候,需要对对象进行序列化。实现Serializable接口的作用就是可以把对象存到字节流,然后可以恢复。

    有时候我们的实体类并没有实现Serializable接口,依旧可以存入数据库,这是因为对于引用类型如Data等,它们所在类已经实现了序列化,而对于基本类型,数据库里面有与之对应的数据结构字段,从我们的类声明来看,我们没有实现serializabel接口,其实是在声明各个不同变量的时候,由具体的数据类型帮助我们实现了序列化操作。

    此外,对于NoSql数据库,并没有与Java基本类型对应的数据结构,因此要把对象存入NoSql数据库中,对象所在类就必须实现Serializable接口。

    serialversionUID

    实现Serializable接口的类,如果没有自己申明一个serialversionUID变量,接口会默认对该类生成一个serialversionUID。
    serialversionUID是用来辅助对象的序列化和反序列化过程的,原则上序列化后的数据中的serialversionUID与当前类中的serialversionUID值相同,那么对象在反序列的时候才会成功,因为反序列的时候,会检测序列化数据中的serialversionUID和对象中的serialversionUID值是否相同。

    展开全文
  • 定义一个类实现Serializable接口

    千次阅读 2016-09-03 19:01:52
    一、序列化简介 序列化是Java的一个非常重要的...如果想让一个类可被序列化,那么这个类必须实现Serializable接口,这个接口本身没有任何方法和属性,它的作用只是为了标示一个类可以被序列化,这一个特性好像J

    一、序列化简介

    序列化是Java中的一个非常重要的特性,通过序列化机制,我们可以将Java的对象变成流,或者存储在硬盘中,或者通过网络传输给网络的其他用户。序列化是J2EE中的一个重要的技术。

    二、Serializable接口 
    如果想让一个类可被序列化,那么这个类必须实现Serializable接口,这个接口本身没有任何方法和属性,它的作用只是为了标示一个类可以被序列化,这一个特性好像在Java里用的比较多,比如克隆也是采用了相同的机制。

    Serializable表明这个类可以直接写入一个流而进行存储,网络传输等操作。

    Serializable表示这个类可以被序列化,告诉JVM这个类可以进行持久化操作,具体的内容你可以搜索一下序列化的知识

    因此,如果我们想创建一个可以被序列化的类,我们可以像下面的代码一样做。
    public class OrderPayDataVo implements Serializable {
        /**
         * 订单号
         * */
        public String orderNo;
        /**
         * 订单总金额
         */
        public double payPrice;
        /**
         * 商品名称(课程包名称)
         * */
        public String title;
        /**
         * 订单剩余有效时间
         * */
        public long leftPayTime;
        /**
         * 支付类型:1是支付宝,2是微信, 3是扫码支付
         * */
        public int payType;
    }
    然后我们可以定义一个方法将实体类存入bundle中:
    public void startOrderPay(OrderPayDataVo orderPayDataVo){
        //跳去相应的支付方式
        Bundle bundle = new Bundle();
        bundle.putSerializable(AppConstant.INTENT_ORDER_COURSE_PAY, orderPayDataVo);
    }
    之后我们就可以获取实体类了:

    private void initData() {
        Bundle bundle = getIntent().getExtras();
        CoursePayPojo mCoursePayPojo = (CoursePayPojo) bundle.getSerializable(
                                        AppConstant.INTENT_ORDER_COURSE_PLAN);
        if (null == mCoursePayPojo || TextUtils.isEmpty(mCoursePayPojo.getOrderNumers())) {
            T.getInstance(this).s("订单生成失败,请重新购买");
            finish();
            return;
        }
    // 从而获取实体类中的属性了
       mPayPrice = mCoursePayPojo.getPayPrice();
        mOrderNo = mCoursePayPojo.getOrderNumers();
        mLeftPayTime = mCoursePayPojo.getLeftPayTime();
        mTitle = mCoursePayPojo.getCourseName();
    }
    我这只是对序列化做的简单解释以及实际使用,更深层次的序列化学习就需要查阅相关资料了,我就不班门弄斧了。

    展开全文
  • Java里面的接口,虽然定义了但是没有定义方法,某些情况下,还得要求一个类必须实现它们,这个时候这些接口是作为一个标识,例如,Serializable接口和Cloneable接口
  • 问题来源 使用shiro搭建项目 之前的user 未曾改变 后来user添加了两个属性 就出来下图错误 最终搜了搜记录下 这个序列化id作用 项目使用了Redis作为缓存(序列化后的对象存入redis缓存)对象经常要通过IO进行...
  • JAVA类实现序列接口Serializable接口的用处
  • Java类通过实现Serializable接口来实现该类对象的序列化,这个接口非常特殊,没有任何方法,只起标识作用。Java序列化保留了对象类的元数据,如类、成员变量、继承类信息等、以及对象数据等,兼容性最好,但不支持跨...
  • java中Serializable接口的理解

    千次阅读 2016-09-27 16:11:06
    最近阅读JDK源码的集合,看到很多集合类实现了Serializable接口,Cloneable接口。阅读了很多关于Serializable接口的博客后,浅谈下我对Serializable接口的理解。 序列化 查看 官方文档 就会发现 ...
  • 添加后的效果: 添加:Settings --》 Editor --》Inspections --》勾选 Serializable class without ‘serialVersionUID’
  • 实现Serializable接口

    2016-09-19 15:43:19
    Serializable接口:该接口仅仅是一个标记接口,无任何方法定义。 当一个类实现了Serializable接口表示该类可序列化。序列化是将一个实现Serializable接口的对象转化成一个字节序列(一组byte)。可以把该字节序列...
  • Serializable 接口

    2009-05-05 10:08:00
    Serializable接口 public interface Serializable类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。...
  • 首先我们要明确到底什么是Serializable接口:一个对象序列化的接口,一个类只有实现了Serializable接口,他的对象才能够被序列化 那么什么是序列化?序列化是将对象状态转换为可保持或传输的格式的过程。与序列化...
  • Serializable接口与Externalizable接口区别

    千次阅读 2019-07-21 10:52:55
    Serializable接口声明的类的对象的内容都将被序列化,如果现在用户希望自己指定序列化的内容,则可以让一个类实现Externalizable接口,此接口定义如下: public interface Externalizable extends Serializable ...
  • 一般情况下,我们在定义实体类时会继承Serializable接口 我们实体类引用了Serializable这个接口,那么这个接口到底有什么?细心的你会发现我们还定义了个serialVersionUID变量。这个变量到底有什么作用 什么...
  • 一般情况下,我们在定义实体类时会实现Serializable接口,例如: 什么是Serializable接口 一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化。 Serializable是java.io包中定义
  • java类实现Serializable接口的原因

    千次阅读 2018-08-06 11:11:36
    背景:一个java的类只有实现了Serializable接口,它的对象才是可序列化的。...为什么要进实现Serializable接口:为了保存内存的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再...
  • javaSerializable接口官方定义是: public interface Serializable 类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有...
  • javaserializable接口详解

    千次阅读 2015-08-03 12:10:15
    Java提供一种机制叫做序列化,通过有序的格式或者字节序列持久化java对象,其中包含对象的数据,还有对象的类型,和保存对象的数据类型。 所以,如果我们已经序列化了一个对象,那么它可以被读取并通过对象的...
  • hibernate使用serializable接口

    千次阅读 2009-10-08 14:42:00
    hibernate的缓存机制通过使用序列化,断定应该是基于序列化的缓存,如没有serializable接口序列化时,使用objectOutputStream的write(object)方法将对象保存到文件时将会出现异常java常见的几个类(如:...
  • javaSerializable接口的作用

    千次阅读 2018-04-16 16:29:56
    将对象的状态信息转换为可以存储或传输的形式的过程,序列化期间,对象将其当前状态写入到临时存储区或持久性存储区,之后,便可以通过从存储区读取或反序列化对象的状态信息,来重新创建该对象什么情况下需要...
  • Java实现Serializable接口

    2018-05-12 08:47:23
    一个类实现了Serializable接口后,其成员变量是只能定义一次吗?为什么我用Java对象流传输对象的时候,即使每次都new一个新对象输入,输入全都是跟第一次输入的一样????????
  • Cloneable可以实现对象的克隆复制,Serializable主要是对象序列化的接口定义。很多时候我们涉及到对象的复制,我们不可能都去使用setter去实现,这样编写代码的效率太低。JDK提供的Cloneable接口正是为了解决对象...
  • 转自:https://blog.csdn.net/xiaomingdetianxia/article/details/74453033Cloneable接口clone:它...Java 一个类要实现clone功能 必须实现 Cloneable接口,否则调用 clone() 时会报 CloneNotSupportedExcep...
  • 最近学习Android IPC(Inter-Process Communication)机制时,提到Android 对象的序列化,有两种方法可以实现对象序列化,一种是Serializable接口,另外一种是Parcelable接口。实现Serializable接口是Java SE本身...
  • 【序列化 Serializbale 接口定义:】 package java.io; /* * @author unascribed * @see java.io.ObjectOutputStream * @see java.io.ObjectInputStream * @see java.io.ObjectOutput * @see java.io....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 122,203
精华内容 48,881
关键字:

在serializable接口中定义了