先普及一下,計算機中無法識別一個基本單元【字節】來表示,必須經過“翻譯”才能讓計算機理解人類的語言,這個翻譯過程就是【編碼】,通常所說的字符轉換為字節。 有I/O的地方機就會涉及編碼,現在幾乎所有的應用程序都涉及網絡I/O和磁盤I/O,而數據傳輸時都是以字節為單位的,所以所有的數據都必須能夠序列化為字節。
什么是Java序列化?
簡單來說 序列化就是把Java對象儲存在某一地方(硬盤、網絡),也就是將對象的內容進行流化。
反序列化:就是把二進制數據反序列化成對象數據
為什么要序列化?
方便於傳輸、存儲(內存中的對象狀態保存到一個文件中或者數據庫中;套接字在網絡上傳送對象;RMI)。
JAVA序列化有哪些方式(性能由低至高)
Java Serialization(主要是采用JDK自帶的Java序列化實現,性能很不理想)
Json(目前有兩種實現,一種是采用的阿里的fastjson庫,另一種是采用dubbo中自己實現的簡單json庫)
FastJson(阿里的fastjson庫)
Hession(它基於HTTP協議傳輸,使用Hessian二進制序列化,對於數據包比較大的情況比較友好。)
Dubbo Serialization(阿里dubbo序列化)
FST(高性能、序列化速度大概是JDK的4-10倍,大小是JDK大小的1/3左右)
Kryo
重點說下 FST的用法——>開源中國:http://www.oschina.net/p/fst
<dependency>
<groupId>de.ruedigermoeller</groupId>
<artifactId>fst</artifactId>
<version>2.04</version>
</dependency>
// ! reuse this Object, it caches metadata. Performance degrades massively
// if you create a new Configuration Object with each serialization !
static FSTConfiguration conf = FSTConfiguration.createDefaultConfiguration();
...
public MyClass myreadMethod(InputStream stream) throws IOException, ClassNotFoundException
{
FSTObjectInput in = conf.getObjectInput(stream);
MyClass result = in.readObject(MyClass.class);
// DON'T: in.close(); here prevents reuse and will result in an exception
stream.close();
return result;
}
public void mywriteMethod( OutputStream stream, MyClass toWrite ) throws IOException
{
FSTObjectOutput out = conf.getObjectOutput(stream);
out.writeObject( toWrite, MyClass.class );
// DON'T out.close() when using factory method;
out.flush();
stream.close();
}