本次整理的是学习序列化与反序列化的内容
废话少说,先上代码
package com.NicMark.inputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class ObjectInnputStream_ {
public static void main(String[] args) throws Exception{
String filePath = "C:\\Users\\DELL\\Desktop\\IO\\file\\data.dat";
ObjectInputStream obji = null;
try {
obji = new ObjectInputStream(new FileInputStream(filePath));
//读取的顺序(反序列化的顺序)要跟存放的顺序(序列化的顺序)一致
//否则会出现异常
System.out.println(obji.readInt());
System.out.println(obji.readBoolean());
System.out.println(obji.readChar());
System.out.println(obji.readDouble());
System.out.println(obji.readUTF());
//dog 的编译类型是Obj,运行类型是Dog
Object o = obji.readObject();
System.out.println("运行类型="+o.getClass());//在底层把Obj转型成一只狗
System.out.println("dog信息="+o);
//如果我们希望调用Dog的方法
//需要我们向下转型
//需要我们将Dog类的定义,拷贝到可以引用的地方
//Dog dog2 = (Dog)dog;
} catch (IOException e) {
e.printStackTrace();
}finally {
obji.close();
}
}
}
package com.NicMark.outputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
//完成数据的序列化
public class ObjectOutputStream_ {
public static void main(String[] args) {
//序列化后,保存的文件格式,不是纯后缀的,而是按照他的格式来保存的
String filePath = "C:\\Users\\DELL\\Desktop\\IO\\file\\data.dat";
try {
ObjectOutputStream obj = new ObjectOutputStream(new FileOutputStream(filePath));
//序列化数据到data.dat文件中
//本质是个对象
obj.writeInt(100);//int -> Integer(实现了 Serializable)
obj.writeBoolean(true);//boolean -> Boolean(实现了 Serializable)
obj.writeChar('a');//char -> Character(实现了 Serializable)
obj.writeDouble(9.5);//double -> Double(实现了 Serializable)
obj.writeUTF("NicMark");//String(实现了 Serializable)
//保存一个dog对象
//系列化某个类的对象,必须将类Serializable
obj.writeObject(new Dog("WANGCAI",23));
} catch (IOException e) {
e.printStackTrace();
}finally {
}
}
}
class Dog implements Serializable {
private String name;
private int age;
public Dog(String name,int age){
this.name = name;
this.age = age;
}
public String toString(){
return "Dog{"+
"Name="+name+'\''+
",Age="+age+
'}';
}
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;
}
}
在文本文件保存的时候,经常会设置不同的编码予以保存。
在系统里,我们默认的编码方式是utf8,但当我们遇到像是jdk或者其他的编码方式的话,会导致字符串乱码的问题,由此,我们的序列化与反序列化就显得尤为重要了。
这是将内容序列化的code
public class ObjectOutputStream_ {
public static void main(String[] args) {
//序列化后,保存的文件格式,不是纯后缀的,而是按照他的格式来保存的
String filePath = "C:\\Users\\DELL\\Desktop\\IO\\file\\data.dat";
try {
ObjectOutputStream obj = new ObjectOutputStream(new FileOutputStream(filePath));
//序列化数据到data.dat文件中
//本质是个对象
obj.writeInt(100);//int -> Integer(实现了 Serializable)
obj.writeBoolean(true);//boolean -> Boolean(实现了 Serializable)
obj.writeChar('a');//char -> Character(实现了 Serializable)
obj.writeDouble(9.5);//double -> Double(实现了 Serializable)
obj.writeUTF("NicMark");//String(实现了 Serializable)
//保存一个dog对象
//系列化某个类的对象,必须将类Serializable
obj.writeObject(new Dog("WANGCAI",23));
} catch (IOException e) {
e.printStackTrace();
}finally {
}
}
}
class Dog implements Serializable {
private String name;
private int age;
public Dog(String name,int age){
this.name = name;
this.age = age;
}
public String toString(){
return "Dog{"+
"Name="+name+'\''+
",Age="+age+
'}';
}
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;
}
}
当我们序列化的时候,我们需要将相应的内容给他具体的类型传入到文件中,
obj.writeInt(100);//int -> Integer(实现了 Serializable)
obj.writeBoolean(true);//boolean -> Boolean(实现了 Serializable)
obj.writeChar('a');//char -> Character(实现了 Serializable)
obj.writeDouble(9.5);//double -> Double(实现了 Serializable)
obj.writeUTF("NicMark");//String(实现了 Serializable)
当上面这些进行序列化的时候,自动转换,实现Serializable,
特别的,我们要将一个对象序列化时,
class Dog implements Serializable {
private String name;
private int age;
public Dog(String name,int age){
this.name = name;
this.age = age;
}
public String toString(){
return "Dog{"+
"Name="+name+'\''+
",Age="+age+
'}';
}
我们必须让这个对象所从属的类class Dog implements Serializable(){}
,否则,将会报错。
在反序列化的操作时,我们也要通过它相应的类型,进行反序列化操作
System.out.println(obji.readInt());
System.out.println(obji.readBoolean());
System.out.println(obji.readChar());
System.out.println(obji.readDouble());
System.out.println(obji.readUTF());
//dog 的编译类型是Obj,运行类型是Dog
Object o = obji.readObject();
System.out.println("运行类型="+o.getClass());//在底层把Obj转型成一只狗
System.out.println("dog信息="+o);
如果说想要单独的调用Dog类的某一个方法,我们需要让其可以被调用,即让它成为一个public型,或者将这个类复制粘贴在这个代码下。
需要注意的是
wirteUTF或者readUTF是读入读出字符串的意思。
今天的总结到这里就结束了
江湖不远,我们有缘再见