1. 程式人生 > >有關java中物件序列化與反序列化的亂碼問題

有關java中物件序列化與反序列化的亂碼問題

在一開始學習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");
		//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流操作中的有關物件序列化與非序列化的時候,很多初學者會糾結於寫出的檔案出現亂碼的問題。 以下是有關序列化與反序列化的相關程式碼。 第一步:先建立相關的物件。package day02; import java.io.Serializable; impo

java序列序列的問題

java序列化是將java物件轉換為位元組序列的過程,變成計算機能夠儲存的二進位制序列       反序列化是將位元組序列恢復成java物件的過程 1.當兩個Java程序進行通訊時,能否實現程序間的物件傳送呢?答案是可以的。如何做到呢?這就需要Java序列化與反

java提高篇——java物件序列序列

      把物件轉換為位元組序列的過程稱為物件的序列化 。    把位元組序列恢復為物件的過程稱為物件的反序列化 。   物件的序列化主要有兩種用途:   1) 把物件的位元組序列永久地儲存到 硬碟 上,通常存放在一個檔案中;   2

Java IO詳解(六)------序列序列物件流)

1、什麼是序列化與反序列化? 序列化:指把堆記憶體中的 Java 物件資料,通過某種方式把物件儲存到磁碟檔案中或者傳遞給其他網路節點(在網路上傳輸)。這個過程稱為序列化。通俗來說就是將資料結構或物件轉換成二進位制串的過程   反序列化:把磁碟檔案中

java序列序列

序列化與反序列化 一 、什麼是序列化與反序列化 把物件轉換為位元組序列的過程稱為物件的序列化。 把位元組序列恢復為物件的過程稱為物件的反序列化 一個物件只要實現了Serilizable介面,這個物件就可以被序列化,java的這種序列化模式為開發者提供了很多便利

Java 物件序列 (json格式)

將 物件序列化與反序化 (json格式) 實體類 package com.nf.redisDemo1.entity; public class News { private long id; private String title; private S

java序列序列

       把物件轉換為位元組序列的過程稱為物件的序列化。   把位元組序列恢復為物件的過程稱為物件的反序列化。   物件的序列化主要有兩種用途:   1) 把物件的位元組序列永久地儲存到硬碟上,通常存放在一個檔案中;   2) 在網路上傳送物件的位元組序列

Java的基礎----序列序列的作用

Java提供兩種物件持久化的方式,分別序列化和外部序列化。 1)序列化(Serialization):         在分散式環境下,無論是何種資料,都會以二進位制序列的形式在網路上傳輸。序列化是一種將物件以一連串的位元組描述的過程,用於解決在對物件流進行讀寫操作時

java io詳解六:序列序列物件流)

1、什麼是序列化與反序列化?   序列化:指把堆記憶體中的 Java 物件資料,通過某種方式把物件儲存到磁碟檔案中或者傳遞給其他網路節點(在網路上傳輸)。這個過程稱為序列化。通俗來說就是將資料結構或物件轉換成二進位制串的過程   反序列化:把磁碟檔案中的物件資料或者把網路節點上的物件資料,恢

Java物件序列序列的應用

當兩個程序在進行遠端通訊時,彼此可以傳送各種型別的資料。無論是何種型別的資料,都會以二進位制序列的形式在網路上傳送。傳送方需要把這個Java物件轉換為位元組序列,才能在網路上傳送;接收方則需要把位元組序列再恢復為Java物件。  把Java物件轉換為位元組序列的過程稱為物件的序列化。

Java資料通訊使用Google Protobuf實現序列序列

一、.什麼是protocol buffer        ProtocolBuffer是用於結構化資料序列化的靈活、高效、自動的方法,有如XML,不過它更小、更快、也更簡單。你可以定義自己的資料結構,然後使用程式碼生成器生成的程式碼來讀寫這個資料結構。你甚至可以在無需重新

java序列序列transient和static成員剖析

在我的上一篇博文中講解了一些基本的關於java序列化與反序列化的問題,現在我們一起來對物件中宣告為transient和static的變數進行解析。 1:類中宣告為transient變數 一旦類中某個變數宣告為transient,則會告訴JVM,你不用幫我序列化該變數,我自己

java序列序列(5)------序列物件的建立方式

可以執行如下的程式碼進行測試:/** * * @author yujie.wang * */ public class CreateObjectTest { public static void main(String[] args) { // TODO Auto-generated met

Java 序列序列

一、 序列化和反序列化概念 Serialization(序列化)是一種將物件以一連串的位元組描述的過程;反序列化deserialization是一種將這些位元組重建成一個物件的過程。將程式中的物件,放入檔案中儲存就是序列化,將檔案中的位元組碼重新轉成物件就是反序列化。 二、 序列化和反序列化的必要性 當兩個程

Java核心類庫-IO-對象流(實現序列序列

.get throws 反序 code row cts new java cep 使用對象流來完成序列化和反序列化操作:   ObjectOutputStream:通過writeObject()方法做序列化操作的   ObjectInputStream:通過readObje

Java IO-5 序列序列

str ride log getname file urn turn objects transient 建一個Person類 1 package demo05; 2 3 import java.io.Serializable; 4 5 public cla

Java序列序列

setname [] 進制 方式 gets 創建 保存 ati 取數據 Java序列化與反序列化是什麽?為什麽需要序列化與反序列化?如何實現Java序列化與反序列化?本文圍繞這些問題進行了探討。 1.Java序列化與反序列化 Java序列化是指把Java對象轉換為字節序

asp.net mvc如何處理字符串對象之間的序列序列(一)

osi strong 類結構 plain pbo edate inf esc arp 前臺我們一般用ajax來發送數據到後端進行處理,如果json數據結構和後臺的實體類結構一致,就直接可以反序列化為指定的對象進行操作,非常方便。 前端發送的json數據結構: 後端實體結

Java將對象寫入文件讀出——序列序列

ansi print 成員 trace 對象的引用 ack lose 靜態 spa Java類中對象的序列化工作是通過ObjectOutputStream和ObjectInputStream來完成的。 寫入: 1 File aFile=new File(

01. Java對象的序列序列簡介

語音 log -c object height 通訊 圖片 二進制 進程    Java對象的序列化與反序列化 ; 給大家講解一下什麽是序列化 & 反序列化      當兩個進程進行遠程通訊的時候,彼此相互可以發送各種類型的數據,如文本,圖片,語音和視頻等無論是任何