1. 程式人生 > >使用序列化儲存物件資訊的時候出現中文亂碼問題

使用序列化儲存物件資訊的時候出現中文亂碼問題

eclipse的預設文字編碼格式

預設是GBK的編碼格式,可以調成UTF-8的格式,方法是:

Windows—preferences—General—Workspace—text for encoding

改成UTF-8即可

1541755254047

序列化物件

1、將eclipse預設編碼格式改變特別注意的一點是,你以前用預設編碼格式的所有專案的中文將會全部亂碼,如果再切換成GBK也是沒有作用的

2、使用序列化將物件進行儲存成檔案格式,是一種二進位制編碼儲存,所以你開啟儲存的txt檔案,開啟是中文亂碼的,這點初學者是最想不通的一點,甚至會和我一樣傻逼的看看能不能用用轉換編碼試試,就是用fileoutputstreamwriter進行編碼轉換,但還是沒有理解這些流類的層級關係,序列化物件使用的ObjectOutputstream是位元組輸出流,是Outputstream的一個子類,而fileoutputstreamwriter是字元流Writer的一個子類,這兩者不能混了。

3、所以就需要反序列化將你序列化的物件進行輸出到控制檯給大家看

package test2;

import java.io.Serializable;

/*
 * 學生類
 */
public class Student implements Serializable {
	private static final long serialVersionUID = 1L;
	private String id;
	private String name;
	private int age;
	private String sex;
	private String address;
	

	public
Student() { super(); // TODO Auto-generated constructor stub } public Student(String id, String name, int age, String sex, String address) { super(); this.id = id; this.name = name; this.age = age; this.sex = sex; this.address = address; } public String getId() { return id; }
public void setId(String id) { this.id = id; } 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 getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "編號:" +this.getId() +"\t" + "姓名:" +this.getName() +"\t" + "年齡:" + this.getAge()+"\t" + "性別:" +this.getSex()+ "\t" + "地址"+this.getAddress(); } }
public class Test {
	public static void main(String[] args) {
		//集合儲存學生資訊
		List<Student> list =new ArrayList<Student>();
		//新增2個學員到集合中
		list.add(new Student("101", "張三", 20, "男", "深圳福田"));
		list.add(new Student("102", "李四", 23, "男", "深圳龍崗"));
		list.add(new Student("103", "王五", 22, "女", "深圳寶安"));
		
		//序列化集合物件儲存學生資訊
		ObjectOutputStream oos=null;
		try {
			 oos=new ObjectOutputStream(new FileOutputStream("src//test2//test.txt"));
//			 System.out.println(stu);
			 oos.writeObject(list);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				oos.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	} 
}

1541755604811

反序列化物件

將剛才序列化的集合物件通過反序列化顯示在控制檯

ObjectInputStream ois=null;
 //反序列化顯示集合中資訊,得到新的集合
			 ois=new ObjectInputStream(new FileInputStream("src//test2//test.txt"));
			 @SuppressWarnings("unchecked")
			ArrayList<Student> list2=(ArrayList<Student>) ois.readObject();
			 //遍歷集合
			 for (int i = 0; i < list2.size(); i++) {
				Student stu=list.get(i);
				System.out.println(stu);
			}

1541756607896

要深刻理解序列化和反序列化