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