首页 > 其他分享 >序列化流和反序列化流

序列化流和反序列化流

时间:2024-10-10 18:49:02浏览次数:8  
标签:流和反 name 对象 age Student 序列化 public

序列化流

ObjectOutputStream 序列化流/对象操作输出流

包装基本流,属于字节流的一种,负责输出数据。可以把Java中的对象写到本地文件中去。

构造方法:

public ObjectOutputStream(OutputStream out)把基本流包装成高级流

成员方法:

public final void writeObject(Object obj)把对象序列化(写出)到文件中去

序列化流的小细节:使用对象输出流将对象保存到文件时会出现NotSerializableException异常

解决方案:需要让Javabean类实现Serializable接口。Serializable接口里面是没有抽象方法,是标记型接口,一旦实现了这个接口,那么就表示当前的Javabean类可以被序列化。

public class ObjectStreamDemo1 {
    public static void main(String[] args) throws IOException {
        /*
           需求:
                利用序列化流/对象操作输出流,把一个对象写到本地文件中

           构造方法:
                public ObjectOutputStream(OutputStream out)         把基本流变成高级流

           成员方法:
                public final void writeObject(Object obj)           把对象序列化(写出)到文件中去

        */
        //1.创建对象
        Student stu = new Student("zhangsan",23);
        //2.创建序列化流的对象/对象操作输出流
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("myio\\a.txt"));
        //3.写出数据
        oos.writeObject(stu);
        //4.释放资源
        oos.close();
    }
}

Javabean类:

/*
*
* Serializable接口里面是没有抽象方法,标记型接口
* 一旦实现了这个接口,那么就表示当前的Student类可以被序列化
* 理解:
*       一个物品的合格证
* */
public class Student implements Serializable {
    private String name;
    private int age;


    public Student() {
    }

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

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

反序列化流

ObjectInputStream 反序列化流/对象操作输入流

可以把序列化到本地文件中的对象,读取到程序中来。

构造方法:

public ObjectInputStream(InputStream out)把基本流变成高级流

public Object readObject()把序列化到本地文件中的对象,读取到程序中来

public class ObjectStreamDemo2 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        /*
           需求:
                利用反序列化流/对象操作输入流,把文件中中的对象读到程序当中
           构造方法:
                public ObjectInputStream(InputStream out)         把基本流变成高级流
           成员方法:
                public Object readObject()                        把序列化到本地文件中的对象,读取到程序中来
        */

        //1.创建反序列化流的对象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("myio\\a.txt"));
        //2.读取数据
//        Object o = ois.readObject();
        Student o = (Student) ois.readObject();
        //3.打印对象
        System.out.println(o);
        //4.释放资源
        ois.close();
    }
}

序列化流/反序列化流的细节汇总

1、使用序列化流将对象写到文件时,需要让Javabean类实现Serializable接口。否则,会出现NotSerializableException异常。

2、序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了。

3、序列化对象后,修改了Javabean类,再次反序列化,会不会有问题?

会,报InvalidClassException异常,因为文件中的版本号,跟Javabean中的版本号不匹配。

解决方法:给Javabean类添加 serialVersionUID(序列号、版本号)

方法1:手动添加

private static final long serialVersionUID=1L;

方法2:idea设置以下选项  

可以自动生成版本号,点击类名Alt+Enter选择以下选项

4、如果一个对象中的某个成员变量的值不想被序列化,如何实现?

解决方案:

给该成员变量加 transient 瞬态关键字修饰,该关键字标记的成员变量不参与序列化过程

标签:流和反,name,对象,age,Student,序列化,public
From: https://blog.csdn.net/qq_58158407/article/details/142713601

相关文章

  • 1day 未公开 金蝶 EAS 反序列化 RCE 漏洞
     0x01阅读须知        技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用......
  • 【java开发】Hessian序列化
    除开前面提到的几种序列化方案外,相信看过Dubbo框架源码的小伙伴,一定还知道一种方案,即基于二进制实现Hessian,这是Dubbo中默认的序列化机制,用于服务提供者与消费者之间进行数据传输,这里咱们也简单过一下。Hessian和JDK原生的序列化技术,兼容度很高,相较于使用ProtoBuf而言,成本要低许......
  • C# 类型增加自定义xml序列化
    1、首先类需要增加[Serializable]标识2、类实现IXmlSerializable接口下面是重写ReadXml和WriteXml方法publicvoidReadXml(XmlReaderreader){reader.ReadStartElement(reader.LocalName);while(reader.Read()){if(reader.Name=="TimeType"&&......
  • Java反序列化
    Java反序列化什么是序列化和反序列化如果我们需要持久化Java对象比如将Java对象保存在文件中,或者在网络传输Java对象,这些场景都需要用到序列化。序列化:将数据结构或对象转换成二进制字节流的过程反序列化:将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的......
  • Unity 二维数组序列化
    unity中,二维以上的数量是不支持序列化的,如:usingSystem.Collections.Generic;usingUnityEngine;publicclassTestArray:MonoBehaviour{//不支持序列化(在Inspector面板无法显示)publicRect[][]rect2Ds;//不支持序列化(在Inspector面板无法显示)//pub......
  • 序列化器中拿到request
    classUpdateMobileSerializer(serializers.ModelSerializer):old=serializers.CharField(write_only=True,validators=[RegexValidator(r"\d{11}",message="格式错误")])mobile=serializers.CharField(write_only=True,validators=[RegexV......
  • 序列化对象输出
    publicclassSerializableObj{publicstaticvoidmain(String[]args){ObjectOutputStreamoos=null;try{//1.创建ObjectOutputStream输出流oos=newObjectOutputStream(newFileOutputStream("D:\\doc\\person.ba......
  • 序列化器ser.validated_data、ser.initial_data、ser.data
    1.ser.data示例:在视图中返回序列化后的数据returnResponse(serializer.data)2.ser.validated_dataifserializer.is_valid():validated_data=serializer.validated_data3.ser.initial_data原始数据4.示例:classLoginPwdSerializer(serializers.Serializer):m......
  • java 反序列化 cc6 复现
    复现环境:common-collections版本<=3.2.1,java版本随意.我们观察java高于8u71的版本会发现sun.reflect.annotation.AnnotationInvocationHandler类被进行了修改,其中的readObject不去调用setvalue方法,而是创建了一个LinkedHashMapvar7去重新进行操作,使我们之前的利用链中断.p......
  • 全网最适合入门的面向对象编程教程:55 Python字符串与序列化-字节序列类型和可变字节字
    全网最适合入门的面向对象编程教程:55Python字符串与序列化-字节序列类型和可变字节字符串摘要:在Python中,字符编码是将字符映射为字节的过程,而字节序列(bytes)则是存储这些字节的实际数据结构,字节序列和可变字节字符串的主要区别在于其可变性和用途,bytearray是可变的字节序列......