首页 > 其他分享 >对象流,序列化和反序列化 day18

对象流,序列化和反序列化 day18

时间:2024-08-18 19:26:36浏览次数:8  
标签:String 对象 Student address 序列化 day18 public name

package com.shujia.day18.ketang;

import java.io.*;

/*
    序列化流:
        序列化:将一个对象转换成网络中传输的流
            对象输出流:ObjectOutputStream     将一个类的对象写进文本中
        反序列化:将网络中传输的流还原成一个对象
            对象输入流:ObjectInputStream      将写入的类的对象输入到JVM,如果要调用该对象的方法,则需要向下转型
 */
/*
    一个类对象将来要想被序列化,必须要实现Serializable接口,这个接口中没有任何的方法和常量,称为标记接口

    我们在写完对象后,又修改了类中的内容,再读取的还原对象的时候,报错了InvalidClassException
    com.shujia.day18.ketang.Student;
    local class incompatible:
        stream classdesc serialVersionUID = 2442942279365203766,
        local class serialVersionUID = 2935475373948736279,

    原因是修改前有一个地址值,修改后又有一个新的地址值,因为序列化的对象是之前的地址值,所以不能进行反序列化

    解决方案:将serialVersionUID写固定,将来谁都不能改,自动生成即可。

    若成员不想被序列化存储,使用java提供一个关键字进行修饰 transient

 */
public class ObjectOutputStreamDemo1 {
    public static void main(String[] args) {
//        write();
//
        read();

    }

    public static void read(){
        //public ObjectInputStream(InputStream in)
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream("src/com/shujia/day18/data/obj.txt"));
            Object o = ois.readObject(); // new Student("魏一民", 18);实际读出来的是一个对象,若调用该对象的方法,需要向下转型

            Student student = (Student) o;//向下转型
            System.out.println(student);


        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(ois!=null){
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void write(){
        ObjectOutputStream oos = null;
        try {
            //ObjectOutputStream(OutputStream out) 创建一个写入指定的OutputStream的ObjectOutputStream。
            oos = new ObjectOutputStream(new FileOutputStream("src/com/shujia/day18/data/obj.txt"));
            // void writeObject(Object obj) 将指定的对象写入ObjectOutputStream。
            Student s1 = new Student("魏一民", 18,"安徽合肥","110");
            oos.writeObject(s1);
            oos.flush(); // 刷到文件中


        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(oos!=null){
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

学生类

package com.shujia.day18.ketang;

import java.io.Serializable;

/*
    一个类对象将来要想被序列化,必须要实现Serializable接口,这个接口中没有任何的方法和常量,称为标记接口

    我们在写完对象后,又修改了类中的内容,再读取的还原对象的时候,报错了InvalidClassException
    com.shujia.day18.ketang.Student;
    local class incompatible:
        stream classdesc serialVersionUID = 2442942279365203766,
        local class serialVersionUID = 2935475373948736279,

    原因是修改前有一个地址值,修改后又有一个新的地址值,因为序列化的对象是之前的地址值,所以不能进行反序列化

    解决方案:将serialVersionUID写固定,将来谁都不能改,自动生成即可。

    若成员不想被序列化存储,使用java提供一个关键字进行修饰 transient

 */
public class Student implements Serializable {
    private static final long serialVersionUID = 2935475373948736279L;
    private String name;
    private int age;
    private String address;
    private transient String phone;

    public Student() {
    }

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

    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 String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

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

标签:String,对象,Student,address,序列化,day18,public,name
From: https://www.cnblogs.com/qiwei-bigdata/p/18365967

相关文章

  • JAVA中的序列化
    Java序列化是一种机制,它可以将对象状态转换为可存储或可传输的形式。序列化后的对象可以在网络上传输,或者保存到文件、数据库等存储介质中。在Java中,序列化通过实现 java.io.Serializable接口来实现。本文将详细介绍Java序列化的概念、实现方式、优缺点以及代码示例。一、序......
  • JAVA中的反序列化
    Java反序列化是将之前序列化存储的对象状态信息重新恢复为Java对象的过程。这个过程与序列化是相反的,它允许程序从字节流中重建对象,这对于网络传输、对象持久化以及分布式系统中的对象传递至关重要。下面将详细介绍Java反序列化的概念、实现方式、安全注意事项,并通过一个......
  • 六、熟知java(类和对象--引用和继承)
    熟知java(类和对象–引用和继承)一、什么是JAVA中的引用?引用的概念,如果一个变量的类型是类类型,而非基本类型,那么该变量又叫做引用。二、引用和指向newRole();代表创建了一个Role对象,但是只是创建,并不能访问它,为了访问它,我们会使用引用来代表这个对象:Roler=newRol......
  • JDBC链接MySQL day18
    packagecom.shujia.day18.ketang;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.Statement;/*我们要想操作mysql数据库,jdk本身是无法操作的,因为java并不知道将来开发者需要使用java连接什么样的数据库,所以j......
  • 高性能内存对象缓存Memcached原理与部署
    案例概述Memcached概述一套开源的高性能分布式内存对象缓存系统所有的数据都存储在内存中支持任意存储类型的数据提高网站的访问速度数据存储方式与数据过期方式数据存储方式:SlabAllocation按组分配内存,每次分配一个Slab,相当于一个大小为1M的页,然后再1M的空间里根......
  • javaSE面向对象
    面向对象思想编程学习面向对象内容的三条主线Java类及类的成员:(重点)属性、方法、构造器;(熟悉)代码块、内部类面向对象的特征:封装、继承、多态、(抽象)其他关键字的使用:this、super、package、import、static、final、interface、abstract等方法(对功能进行封装,实现代码的复用)方......
  • C安全编程教学-声明和初始化-声明具有正确存储持续期的对象(三)
    注:本课程参考文献《C安全编码标准》 欢迎关注我......
  • 021、Vue3+TypeScript基础,使用watchEffect全自动监视修改的对象
    01、App.vue代码如下:<template><divclass="app"><h2>{{title}}</h2><!--使用了ref来获取子组件的属性--><Person/></div></template><scriptlang="ts"setupname="App"......
  • 第三章:Java 面向对象编程(OOP)基础 第一节 类与对象
    1.类的定义与成员变量首先,我们来了解一下类的定义和成员变量。类的定义:类是Java中用于创建对象的模板,它包含了对象的属性和行为。我们可以通过以下语法定义一个类:publicclassPerson{ //成员变量(属性) Stringname; intage;​ //方法(行为) v......
  • 019、Vue3+TypeScript基础,使用watch监视对象数据时,如何监控整个对象或单独监控对象某
    1、App.vue代码如下:<template><divclass="app"><h2>{{title}}</h2><!--使用了ref来获取子组件的属性--><Person/></div></template><scriptlang="ts"setupname="App"&......