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这个文件中,那么用文本编辑器打开查看的话当然是会出现乱码的。只有通过反序列化才能将存储的二进制读取出来,然后正常显示在控制台上。
以下是有关序列化与反序列化的相关代码。
第一步:先创建相关的对象。
[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这个文件中,那么用文本编辑器打开查看的话当然是会出现乱码的。只有通过反序列化才能将存储的二进制读取出来,然后正常显示在控制台上。
相关文章推荐
- 有关java中对象序列化与反序列化的乱码问题
- Java对象序列化乱码以及字符集的小问题
- java对象序列化的问题
- java中对象的序列化问题
- java 对象序列化和对象反序列化操作时的版本兼容性问题
- 关于将序列化的java对象保存到mysql数据库的一些问题
- JAVA基础 day23 IO流的其他类 (对象的序列化 管道流 RandomAccessFile类(随机读取文件) DateStream(操作基本数据类型的流) 操作数组的流 )字符编码问题
- JSP技术 指令 乱码问题 运行原理和九大隐式对象 web开发的四个域对象 javabean
- 存储两次序列化对象,读取报错问题 java.io.StreamCorruptedException: invalid type code: A
- 关于将Java中序列化对象写入byte[]遇到的一些问题及解决方法
- Java对象序列化文件追加对象的问题,以及Java的读取多个对象的问题解决方法。
- Java对象序列化追加的问题,以及Java的读取多个对象的问题解决方法。
- java可变对象的序列化问题
- Java对象序列化追加的问题,以及Java的读取多个对象的问题解决方法。
- java 序列化ObjectOutputStream 同一文件追加写对象问题的解决
- Java的对象序列化之serialVersionUID问题
- Java对象乱码问题
- 关于json反序列化字符串为java对象时科学计数法和精度问题
- java.io 序列化 总结Serializable 和 Externalizable 的区别与联系,以及输出后的乱码问题
- java IO(三):数据操作流、合并流、回退流、对象序列化、字符编码问题、压缩流