在一开始学习Java流操作中的有关对象序列化与非序列化的时候,很多初学者会纠结于写出的文件出现乱码的问题。
以下是有关序列化与反序列化的相关代码。
第一步:先创建相关的对象。
- package day02;
-
- import java.io.Serializable;
- import java.util.List;
-
- public class Person implements Serializable {
-
- private static final long serialVersionUID = 2L;
- private String name;
- private long salary;
- private String gender;
- private int age;
- private List<String> otherInfo;
- 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 getGender() {
- return gender;
- }
- public long getSalary() {
- return salary;
- }
- public void setSalary(long salary) {
- this.salary = salary;
- }
- public void setGender(String gender) {
- this.gender = gender;
- }
- public List<String> getOtherInfo() {
- return otherInfo;
- }
- public void setOtherInfo(List<String> otherInfo) {
- this.otherInfo = otherInfo;
- }
- public String toString(){
- return name+","+salary+","+gender+","+otherInfo;
- }
-
-
-
第二步:序列化
- package day02;
-
- import java.io.BufferedOutputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.ObjectOutputStream;
- import java.util.ArrayList;
- import java.util.List;
-
- public class OOSDemo {
- public static void main(String[] args) throws IOException {
- FileOutputStream fos=new FileOutputStream("person.obj");
- BufferedOutputStream bos=new BufferedOutputStream(fos);
-
- ObjectOutputStream oos=new ObjectOutputStream(bos);
- Person p=new Person();
- p.setName("李杰");
- p.setSalary(24000);
- p.setGender("26");
-
- List<String> otherInfo=new ArrayList<String>();
- otherInfo.add("读书");
- otherInfo.add("绘画");
- otherInfo.add("music");
-
- p.setOtherInfo(otherInfo);
-
- oos.writeObject(p);
- System.out.println("yes!");
- oos.close();
-
- }
-
- }
第三步:反序列化
- package day02;
-
-
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.ObjectInputStream;
-
-
- public class OISDemo {
- public static void main(String[] args) throws IOException, ClassNotFoundException {
- FileInputStream fis=new FileInputStream("person.obj");
-
- ObjectInputStream ois=new ObjectInputStream(fis);
- Person p=(Person)ois.readObject();
- System.out.println(p);
-
-
- }
-
- }
现在问题来了,好多人会发现,在反序列化程序中运行后能够正常输出Person的相关信息,但是在目录下的文件“person.obj”用文本编辑器打开之后却是乱码的。这是为什么呢?是不是因为写出去的编码和文本编辑器的默认编码采用了不一样的字符集?然后我们就开始想怎么能够将二者的编码格式设为一致的。
其实,这么想一开始就是错误的。为什么这么说呢,因为序列化和反序列化都是基于二进制流的,也就是说,在第二步中,其实就是将person的相关信息转化为二进制存储在了person.obj这个文件中,那么用文本编辑器打开查看的话当然是会出现乱码的。只有通过反序列化才能将存储的二进制读取出来,然后正常显示在控制台上。