1. 序列化和反序列化原理
沒有實現序列化的對象通過流傳輸會報NotSeralizableException
跨jvm傳輸的辦法:序列化和反序列化
序列化:把對象(object)轉化成特定的形態(xml, json),然後以數據流的方式傳輸
序列化不會自動保存static和transient變數
好處:減少對象的大小,對象傳遞的跨平台/語言
反序列化:數據流 ->特定格式(xml,json)->對象
private static final long serialVersionUID = -2975139301805213397L;
serialVersionUID是對象唯一的標記
若不指定serialVersionUID,系統會自動生成一個
關鍵字transient 修飾的對象,表示該對象不需要序列化
實際開發過程中,我們常常會遇到這樣的問題,這個類的有些屬性需要序列化,而其他屬性不需要被序列化,打個比方,如果一個用戶有一些敏感信息(如密碼,銀行卡號等),為了安全起見,不希望在網路操作(主要涉及到序列化操作,本地序列化緩存也適用)中被傳輸,這些信息對應的變數就可以加上transient關鍵字。換句話說,這個欄位的生命周期僅存於調用者的內存中而不會寫到磁碟里持久化。
HashMap
自定義序列化和反序列化方法,通過反射訪問private方法
分布式架構下的序列化技術
1、序列化的數據大小(影響傳輸效率)
2、跨語言, json(對外介面的通信)/xml
對內的服務於服務之間一般使用:
1、hessian
2、msgpack
3、prototuf(壓縮率非常高)(不易使用)
4、kyro
5、avro
6、hassian2(bbo)
7、json(spring cloud)
8、jute(zookeeper)
JSON
Fastjson :序列化,和反序列化速度快,介面簡單,易上手
jackson(spring mvc): 性能要比fastjson和gson要好,穩定性更好
Gson
hessian
性能、易用性要比默認的序列化方式要好
kyro、avro :大數據處理有使用,不能跨語言
prototuf:序列化數據非常小、傳輸效率非常高,每個欄位會按照tag、length(可省略)、value進行序列化
序列化的選項:
序列化空間的大小,(空間)
序列化過程的效率,(時間)
是否支持跨語言
技術的成熟度
2. 如何序列化/反序列化的ArrayList
、Binary方法進行序列化
1、首先。你被序列化的類需要用[Serializable]特性修飾,例如:
[Serializable]
public class AA
{
public int i = 5;
}
2、那麼你可以用如下方法序列化和反序列化:
/// <summary>
/// 序列化為二進制位元組數組
/// </summary>
/// <param name="request">要序列化的對象 </param>
/// <returns>位元組數組 </returns>
public static byte[] SerializeBinary<T>(T request)
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter serializer = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
System.IO.MemoryStream memStream = new System.IO.MemoryStream();
serializer.Serialize(memStream, request);
return memStream.GetBuffer();
}
/// <summary>
/// 從二進制數組反序列化得到對象
/// </summary>
/// <param name="buf">位元組數組 </param>
/// <returns>得到的對象 </returns>
public static T DeserializeBinary<T>(byte[] buf)
{
System.IO.MemoryStream memStream = new MemoryStream(buf);
memStream.Position = 0;
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter deserializer =
new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
T newobj = (T)deserializer.Deserialize(memStream);
memStream.Close();
return newobj;
}
3、調用方法
AA p = new AA();
p.i = 15;
byte[] bytes = SerializeBinary<AA>(p);
AA p2 = DeserializeBinary<AA>(bytes);
二、XML序列化
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.IO;
namespace RegexActivator
{
public class ExtendMethods
{
public static void Serial<T>(T[] items, string path)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T[]));
TextWriter writer = new StreamWriter(path);
try
{
xmlSerializer.Serialize(writer, items);
}
finally
{
writer.Close();
}
}
public static T[] Deserial<T>(string path)
{
if (!File.Exists(path)) return new T[0];
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T[]));
FileStream fs = new FileStream(path, FileMode.Open);
T[] items;
try
{
items = (T[])xmlSerializer.Deserialize(fs);
}
finally
{
fs.Close();
}
return items;
}
}
}