首页 > 其他分享 >序列化与反序列化

序列化与反序列化

时间:2022-08-27 16:23:07浏览次数:77  
标签:String age Person 序列化 public name

参考视频:153、序列化和反序列化哔哩哔哩bilibili

序列化版本说明参考地址:(18条消息) 序列化版本号(serialVersionUID)是做什么用的鲱鱼罐头配白花蛇草水的博客-CSDN博客serialversionuid

序列化与反序列化

3.1 概述

Java提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含对象的数据对象的类型对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。

反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化对象的数据、对象的类型和对象中存储的数据信息。都可以用来在内存中创建对象。

3.2 ObjectOutputStream类

FileOutputStream fileout = new FileOutputStream("xxx.txt");
ObjectOutputStream out = new ObjectOutputStream(fileout);

序列化操作的要求:

(1)该类必须实现java.io.Serializable接口,Serializable是一个标记接口,不实现此接口的类将不会使用任何状态的序列化和反序列化,会抛出NotSerializableException。

(2)该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient关键字修饰。

 

为什么要序列化?

一些场景下需要把对象转变成字节序列

  • 保存到存储介质上(磁盘等)

  • 用于网络传输

 

 

 

序列化案例

package com.mokuiran.serializable;


import java.io.*;

class Person implements Serializable{

   //手动添加序列版本号
   public static final long serialVersionUID = 1L;
/*
在 序列化存储/反序列化读取 或者是 序列化传输/反序列化接收 时,JVM 会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。
*/
   
   
   private String name;
   private int age;

//   private String sex;

   @Override
   public String toString() {
       return "Person{" +
               "name='" + name + '\'' +
               ", age=" + age +
               '}';
  }

   public Person() {

  }

   public Person(String name, int age) {
       this.name = name;
       this.age = 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;
  }
}


//序列化演示
public class Demo {
   public static void main(String[] args) throws IOException {

       Person person = new Person("小明",23);
       System.out.println(person);

       ///序列化
       ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.txt"));
       oos.writeObject(person);//将对象写出到文件

       //关闭资源
       oos.close();
  }
}

反序列化案例

package com.mokuiran.serializable;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

//反序列化演示
public class Demo2 {
   public static void main(String[] args) throws IOException, ClassNotFoundException {
       //创建反序列化流
       ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.txt"));

       Person person = (Person)ois.readObject();//反序列化有可能找不到文件,因此这里需要抛出异常

       System.out.println(person);

       ois.close();
  }
}
/*注意:当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会
失效,抛出一个InvalidClassException异常。发生这个异常的原因如下:
   1.该类的序列版本号与从流中读取的类描述的版本号不匹配
   2.该类包含未知数据类型
   3.该类没有可访问的无参构造方法
*/
 

标签:String,age,Person,序列化,public,name
From: https://www.cnblogs.com/mokuiran/p/16630791.html

相关文章

  • CTFSHOW Web259 SoapClient原生类的反序列化
      index.php   看到该题目第一眼,大脑直接一个简单的想法就是通过访问flag.php添加X-Forwarded-For然后POST发送token数据。但!在本题的环境当中,由于使用了Clou......
  • rest_framework:序列化器类
    一.序列化器类序列化就是把数据转换为json在服务端发送到客户端反序列化是客户端法的数据发送到服务端服务端通过反序列化把数据转换为jsonfromrest_frameworkimp......
  • 面试题:Java序列化与反序列化
    目录序列化和反序列化的概念应用场景?序列化实现的方式继承Serializable接口,普通序列化继承Externalizable接口,强制自定义序列化serialVersionUID的作用静态变量不会被序列......
  • DRF当中序列化器中通过重写create()来实现保护登录保护
    在DRF原来源码框架中,我们知道保存的用户信息时,用户的密码是被明文保存到数据库中。代码实classUserRegisterModelSerializer(serializers.ModelSerializer)   """......
  • 序列化和反序列化
    序列化:把对象变成字符串。一般对象和json格式一样。反序列化:把json字符串转化为对象类型。 参考资料:C#JsonConvert.DeserializeObject反序列化与JsonConvert.Serial......
  • 序列化与反序列化的用法
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Runtime.Serialization.Formatters.Binary;usingSystem.IO;n......
  • fastjson反序列化CNVD-2019-22238
    漏洞原理:fastjson是阿里的开源json解析库,用来将json字符串反序列化为JavaBean类,或者将JavaBean类序列化为json字符串。在java审计中,需要关注的关键字:JSON.parse,......
  • C++反序列化--一种基于class infomation反射库的反序列化数据结构
    序列化与反序列化概念:将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯。这个将程序数据转化成能被存储并传输的格式的......
  • 关于Android中接口Reponse反序列化的思考
    总结kotlindataclass返回值最佳实践,使用ks!字段全写默认值,不可空,取消全部问号!ks速度更快并且支持N多数据类型protobuf+jsonkt默认值只有两种方式可以获取使用k......
  • 代码审计-PHP反序列化漏洞
    什么是序列化序列化可以实现将对象压缩并格式化,方便数据的传输和存储。为什么要序列化?PHP文件在执行结束时会把对象销毁,如果下次要引用这个对象的话就很麻烦,所以就有......