首页 > 编程语言 >JAVA基础-序列化

JAVA基础-序列化

时间:2024-02-19 10:46:23浏览次数:29  
标签:JAVA name 基础 class Person new 序列化 public

1,什么是序列化?

Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程。

2,序列化的使用场景

  1. 永久性保存对象,保存对的字节序列到本地文件或者数据库中;

  2. 通过序列化以字节流的形式对象在网络中进行传递和接收;

  3. 通过序列化在进程间传递对象;

3,java 的对象流序列化

package com.demo.base.serializable;

import java.io.*;

/**
 * 序列化
 * 1,Serializable 普通序列化
 * 2,Externalizable 自定义序列化
 * */
public class SerializableDemo {

    public static class Person implements Serializable {
        private String name;
        private int age;

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }

    public static void main(String[] args) throws IOException {
        //序列化
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("C:\\Users\\GaoXin\\Desktop\\test.txt"));
        Person person = new Person("张三", 14);
        objectOutputStream.writeObject(person);

        //反序列化
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("C:\\Users\\GaoXin\\Desktop\\test.txt"));
        try {
            Person p = (Person) objectInputStream.readObject();
            System.out.println(p);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

4,Fastjson 序列化

public static void fastJsonSerializable(){
    Duck duck = new Duck("张三", 14);
    Person yq = new Person("yq");
    yq.setAnimal(duck);

    String s = JSON.toJSONString(yq);

    Person person = JSON.parseObject(s, Person.class);
    System.out.println(person);
}

5,Jackson 序列化

Jackson 序列化是通过实体类的无参构造方法处理的,所以当有以下情形时反序列化会有问题
1)实体类某个字段的引用是个接口
2)实体类没有无参构造

解决方法:自定义反序列化

实体类:Person 对象持有一个 Animal 接口类型的属性,这时候如果我们使用 ObjectMapper 反序列化会报错
@Data
@JsonDeserialize(using = PersonDeserialize.class)
public class Person implements Serializable {
    private String name;

    //类上有自定义的,这个就不起作用力
    //@JsonDeserialize(using = AnimalDeserialize.class)
    private Animal animal;

    public Person(){}
    public Person(String name){
        this.name = name;
    }
}

public interface Animal extends Serializable {

}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Duck implements Animal {
    private String name;
    private Integer age;
}
自定义的 Person 反序列化实现
public class PersonDeserialize extends JsonDeserializer<Person> {
    @Override
    public Person deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JacksonException {
        JsonNode json = jsonParser.getCodec().readTree(jsonParser);
        String name = json.get("name").asText();

        Person person = new Person(name);

        ObjectMapper om = new ObjectMapper();
        Animal animal = om.readValue(json.get("animal").toString(), Duck.class);
        person.setAnimal(animal);
        return person;
    }
}
测试
public static void jacksonSerializable() throws JsonProcessingException {
        Duck duck = new Duck("张三", 14);
        Person yq = new Person("yq");
        yq.setAnimal(duck);

        JsonMapper jsonMapper = new JsonMapper();
        String s = jsonMapper.writeValueAsString(yq);

        ObjectMapper objectMapper = new ObjectMapper();
        System.out.println( objectMapper.readValue(s, Person.class));
    }

标签:JAVA,name,基础,class,Person,new,序列化,public
From: https://www.cnblogs.com/cnff/p/17013831.html

相关文章

  • JAVA基础-Steam
    1,OptionalJava8中的Optional是一个可以包含或不可以包含非空值的容器对象。1.1,获取Optional的三个方法1.of(value)返回一个Optional,value不可以为null2.empty()返回一个空的Optional3.ofNullable(value)返回一个Optional,如果value为null,就是empty(),否......
  • JAVA基础-类加载过程
    1,类的加载1,类的加载过程2,加载阶段通过一个类的全限定名获取定义此类的二进制字节流将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口加载class文件的方式:从本......
  • JAVA基础-jdk8新特性
    Java8新特性:接口默认方法和静态方法JDK1.8打破了接口只提供了形式,而未提供任何具体实现这一限制,允许定义默认方法和静态方法。定义一个接口:packagecom.zgjt.design.defaults;importjava.util.function.Supplier;publicinterfaceAnimal{//接口默认方法,不必重......
  • Java开发的SRM供应商、在线询价、招投标采购一体化系统源码功能解析
    前言:随着全球化和信息化的发展,企业采购管理面临越来越多的挑战。传统的采购方式往往涉及到多个繁琐的步骤,包括供应商筛选、询价、招投标等,这些过程不仅耗时,而且容易出错。为了解决这些问题,供应商、询价、招投标一体化系统应运而生。该系统通过集成供应商管理、询价管理、招投标......
  • Java对象引用和内存管理的细节
    在Java中,当局部变量(比如方法参数)的作用域结束时,这个局部变量的引用确实不再存在,但这并不意味着它引用的对象会被销毁。对象的销毁是由Java的垃圾回收器(GarbageCollector,GC)来管理的。在Java中,局部变量(如方法参数)通常存储在栈内存(StackMemory)中,而对象实例(如ServletConfig对象)则......
  • 关于java代码Runtime.getRuntime().exec()执行shell脚本中的坑
    java操作shell脚本执行docker命令  Runtime.getRuntime().exec()是不能执行特殊符号如">"、"|"等必须通过"/bin/sh""-c"处理。另外java操作docker 不能分配  dockerexec-i(不要t).另外如果不确定脚本是否执行成功,可以通过waitFor返回的int结果,如果为0脚本执行......
  • 提高Java开发生产力,我选Stream API,真香啊
    Java8引入的StreamAPI提供了一种新的数据处理方式,它以声明式、函数式的编程模型,极大地简化了对集合、数组或其他支持数据源的操作。Stream可以被看作是一系列元素的流水线。允许你高效地对大量数据执行复杂的过滤、映射、排序、聚合等操作,而无需显式地使用循环或者临时变量。St......
  • Java注解篇之@SuppressWarnings注解详解 代码编译通过且可以运行,但每行前面的“感叹号
    Java注解篇之@SuppressWarnings注解详解@SuppressWarnings作用:用于抑制编译器产生警告信息。它的注解目标为类、字段、函数、函数入参、构造函数和函数的局部变量,但是建议注解声明在最接近警告发生的位置。去感叹号?我们经常遇到代码编译通过且可以运行,但每行前面的“感叹号”就......
  • Java集合篇之逐渐被遗忘的Stack,手写一个栈你会吗?
    正月初九,开工大吉!2024年,更上一层楼!写在开头其实在List的继承关系中,除了ArrayList和LinkedList之外,还有另外一个集合类stack(栈),它继承自vector,线程安全,先进后出,随着Java并发编程的发展,它在很多应用场景下被逐渐替代,成为了Java的遗落之类。不过,stack在数据结构中仍有一席之地,因此,......
  • sql注入基础知识
    sql注入基础知识前言:之前也写过sql注入的文章,但更多的是写题的记录,对一些sql注入的基本知识点没有涉及,今天来更进一步的讲解sql注入我们检测是否可以进行注入,首先要查看网站是否存在参数传递,不一定是要在url地址中含有查询字符串,数据可能通过post方式提交,更改post数据也可进行......