当前位置: 首页 > news >正文

一元购网站建设多少钱mysql 注册网站

一元购网站建设多少钱,mysql 注册网站,网站承建商有哪些,网站 手机 微信 app文章目录1.概述2.特点/应用场景3.涉及到的流对象4.代码实现序列化与反序列化4.1 步骤1:创建学生类Student24.2 步骤2:创建序列化测试类5.测试案例中常见的几种编译错误类型6.为什么反序列化版本号需要与序列化版本号一致?7.自动提示 生成UID …

文章目录

  • 1.概述
  • 2.特点/应用场景
  • 3.涉及到的流对象
  • 4.代码实现序列化与反序列化
    • 4.1 步骤1:创建学生类Student2
    • 4.2 步骤2:创建序列化测试类
  • 5.测试案例中常见的几种编译错误类型
  • 6.为什么反序列化版本号需要与序列化版本号一致?
  • 7.自动提示 生成UID 链接的设置


1.概述

  1. 序列化 ObjectOutputStream

    • 是指把程序中的java对象,通过序列化流oos输出到磁盘的文件中,相当于数据写出的过程,利用ObjectOutputStream,把对象的信息,按照固定的格式转成一串字节值输出并持久保存到磁盘
    • 方向是OUT,使用的流是ObjectOutputStream
    • 使用的方法是out.writeObject(目标对象);
    • 注意:如果一个类的对象想要被序列化,那么这个类必须实现Serializable接口
  2. 反序列化 ObjectInputStream

    • 是指把之前已经保存在文件中的对象的相关数据,通过反序列化流ois读到内存中的过程中,并把读到的数据恢复成对象,利用ObjectInputStream,读取磁盘中之前序列化好的数据,重新恢复成对象
    • 相当于数据读取的过程,方向是in,使用的流是ObjectInputStream
    • 使用的方法是in.readObject();
    • 注意:反序列化指定的文件路径,必须与序列化输出的文件路径一致
    • 注意:一次序列化操作对应一次反序列化操作,或者UID必须保持一致,如果不一致,会报错

在这里插入图片描述

2.特点/应用场景

  1. 需要序列化的文件必须实现Serializable接口,用来启用序列化功能
  2. 不需要序列化的数据可以修饰成static,原因:static资源属于类资源,不随着对象被序列化输出
  3. 每一个被序列化的文件都有一个唯一的id,如果没有添加此id,编译器会自动根据类的定义信息计算产生一个
  4. 在反序列化时,如果和序列化的版本号不一致,无法完成反序列化
  5. 常用与服务器之间的数据传输,序列化成文件,反序列化读取数据
  6. 常用使用套接字流在主机之间传递对象
  7. 不需要序列化的数据也可以被修饰成transient(临时的),只在程序运行期间在内存中存在,不会被序列化持久保存

3.涉及到的流对象

序列化:Object OutputStream
ObjectOutputStream 将 Java 对象的基本数据类型写入 OutputStream,通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。

构造方法:
ObjectOutputStream(OutputStream out)
创建写入指定 OutputStream 的 ObjectOutputStream
普通方法:
writeObject(Object obj)
将指定的对象写入 ObjectOutputStream

反序列化:ObjectInputStream
ObjectInputStream对以前使用ObjectOutputStream写入的基本数据和对象进行反序列化重构对象。

构造方法:
ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream
普通方法:
readObject() 从 ObjectInputStream 读取对象

4.代码实现序列化与反序列化

4.1 步骤1:创建学生类Student2

package partThree;
/*本类用于序列化测试的物科类*/
public class Student2 {//定义学生相关的属性并进行封装private String name; //姓名private int age; //年龄private String addr; //地址private char gender;//性别//2.1 创建本类的无参构造--注意必须手动提供无参构造,否则会被覆盖public Student2() {System.out.println("我是Student的无参构造");}//2.2创建全参构造public Student2(String name, int age, String addr, char gender) {super();//默认调用父类的无参构造this.name = name;this.age = age;this.addr = addr;this.gender = gender;System.out.println("我是Student的全参构造");}//3.属性封装后,需要本类提供公共的属性访问与设置方式get()&set()/*** 自动创建get()&set(),右键-->Source-->Generate Getters and Setters...*/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 getAddr() {return addr;}public void setAddr(String addr) {this.addr = addr;}public char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}//如果不想查看对象的地址值,而是想查看类型 属性 属性值//可以在子类中添加重写的toString()@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", addr='" + addr + '\'' +", gender=" + gender +'}';}
}

4.2 步骤2:创建序列化测试类

package partThree;import java.io.*;/* 本类用于测试对象的序列化与反序列化*  序列化 ObjectOutputStream*  是指把程序中的java对象,通过序列化流oos输出到磁盘的文件中,相当于数据写出的过程* 反序列化  ObjectInputStream* 是指把之前已经保存在文件中的对象的相关数据,通过反序列化流ois读到内存中的过程中* 相当于数据读取的过程*/
public class TestSerializable {public static void main(String[] args) {method1(); //本方法用来完成序列化的功能method2(); //本方法用于完成反序列化功能}private static void method2() {//1.定义一个在本方法中都生效的局部变量,注意初始化ObjectInputStream in = null;//2.由于IO操作可能会产生异常,所以完成try-catch-finally结构try{//3.创建反序列化流oisin = new ObjectInputStream(new FileInputStream("E:\\ready\\1.txt"));//4.通过反序列化流,读取文件中的数据,并把读到的数据,回复成数据Object o = in.readObject();System.out.println(o); //将接到的对象打印System.out.println("恭喜您,反序列化成功!");}catch(Exception e){System.out.println("很抱歉,反序列化失败!");e.printStackTrace();}finally {try {in.close();} catch (IOException e) {e.printStackTrace();}}}private static void method1() {//定义一个在本方法中都生效的局部变量,注意初始化ObjectOutputStream out = null;try {//1.创建流对象--需要try-catch,需要设置FileOutputStream子类,// 并设置传输文件路径表明要把序列化后的对象数据输出到哪个文件中out = new ObjectOutputStream(new FileOutputStream("E:\\ready\\1.txt"));//2.使用流对象//2.1 指定一个要序列化输出的对象,并设置属性Student2 s = new Student2("海绵宝宝",3,"海里",'男');//2.2 序列化输出对象s到文件中out.writeObject(s);System.out.println("恭喜您,序列化成功!");//成功后,我们可以在目标文件里看到序列化输出的数据,但注意,这个数据是为了底层保存对象和传输使用的,我们看不懂//有些类似于我们字节码文件中的数据} catch (IOException e) {System.out.println("很抱歉,序列化失败!");e.printStackTrace();}finally {//3.关闭流对象try {out.close();} catch (IOException e) {e.printStackTrace();}}}
}

5.测试案例中常见的几种编译错误类型

在这里插入图片描述

NotSerializableException:报错原因:要序列化对象所在的类并没有实现序列化接口
解决方案:实现序列化接口

在这里插入图片描述

InvalidClassException:报错原因:更改子类数据后,会导致本次反序列化时使用的UID与序列化时的UID不匹配
解决方案:反序列化时的UID与序列化时的UID要保持一致,或者测试时一次序列操作对应一次反序列化操作,否则不匹配就报错,重新进行一次序列化后,再进行反序列化即可;

6.为什么反序列化版本号需要与序列化版本号一致?

我们在反序列化时,JVM会拿着反序列化流中的serialVersionUID与序列化时相应的实体类中的serialVersionUID来比较,如果不一致,就无法正常反序列化,出现序列化版本不一致的异常InvalidClassException。

而且我们在定义需要序列化的实体类时,如果没有手动添加UID,
Java序列化机制会根据编译的class自动生成一个,那么只有同一次编译生成的class才是一样的UID。

如果我们手动添加了UID,只要这个值不修改,就可以不论编译次数,进行序列化和反序列化操作。

7.自动提示 生成UID 链接的设置

在这里插入图片描述

http://www.yayakq.cn/news/705358/

相关文章:

  • 网站免费正能量小说专业网页网站设计图书
  • 网站备案无前置审批文件wordpress百度自动推送
  • 怎么做外贸个人网站深圳制作网站培训机构
  • 建网站用什么语言制作一款app软件大概需要多少费用
  • 哪个网站做ic好景泰做网站
  • 免费制作相册视频网站模板网络优化工程师前景
  • 免费网站重生做军嫂windows优化大师有必要安装吗
  • 网站建设管理情况自查报告建设电商网站的总结报告
  • 黄页推广网站通讯员队伍建设与网站新闻管理
  • 外国排版网站响应式网站怎样做
  • 网站留白桂林漓江游船票价格
  • 专业网站建设哪个好营销型网站建设 ppt
  • psd模板免费下载网站营销方案范文
  • 江夏网站建设ppt在哪个软件制作
  • 网络营销网站源码dw个人网站制作模板
  • 锦州网站建设更好memcached插件wordpress
  • 威海城乡建设局网站网站建设与维修
  • 网站开发钱包wordpress作企业网站好吗
  • 零基础学网站建设 知乎赤风设计
  • 河北建设工程招标网官方网站引流用什么话术更吸引人
  • 建行网站企业网银网站怎么添加百度地图
  • 企业电子商务网站建设的必要性网站扁平化结构和树形结构
  • 做同城信息类网站如何赚钱asp在网站制作中的作用
  • 天津外贸公司网站制作flask做的网站
  • 直播推广渠道济南优化网页
  • 供水开发建设公司网站营业执照包含网站开发
  • 足球用品网络营销方式seo数据优化
  • 广州设计网站公司百度关键词排名推广话术
  • 网站建设哪家比较专业管理系统网站开发
  • 用vs2013网站开发徐州市建设工程