您的位置:首页 > 编程语言 > Java开发

java 中对象序列化与反序列化的乱码问题

2017-05-11 14:23 323 查看
在一开始学习Java流操作中的有关对象序列化与非序列化的时候,很多初学者会纠结于写出的文件出现乱码的问题。

以下是有关序列化与反序列化的相关代码。

第一步:先创建相关的对象。

[java] view
plain copy

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;  

    }  

      

      

      

第二步:序列化

[java] view
plain copy

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();  

          

    }  

  

}  

第三步:反序列化

[java] view
plain copy

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");  

        //BufferedInputStream bis=new BufferedInputStream(fis);//加快读取的速度  

        ObjectInputStream ois=new ObjectInputStream(fis);  

        Person p=(Person)ois.readObject();  

        System.out.println(p);  

          

          

    }  

  

}  

现在问题来了,好多人会发现,在反序列化程序中运行后能够正常输出Person的相关信息,但是在目录下的文件“person.obj”用文本编辑器打开之后却是乱码的。这是为什么呢?是不是因为写出去的编码和文本编辑器的默认编码采用了不一样的字符集?然后我们就开始想怎么能够将二者的编码格式设为一致的。

其实,这么想一开始就是错误的。为什么这么说呢,因为序列化和反序列化都是基于二进制流的,也就是说,在第二步中,其实就是将person的相关信息转化为二进制存储在了person.obj这个文件中,那么用文本编辑器打开查看的话当然是会出现乱码的。只有通过反序列化才能将存储的二进制读取出来,然后正常显示在控制台上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐