導航:首頁 > 方法技巧 > 快速反序列化的方法

快速反序列化的方法

發布時間:2023-01-25 20:50:23

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;
}
}
}

閱讀全文

與快速反序列化的方法相關的資料

熱點內容
蜂窩輔助器使用方法手機版 瀏覽:99
日本生薑紅糖水的正確喝方法 瀏覽:316
維生素減壓最佳方法 瀏覽:239
2的開平方的計算方法 瀏覽:43
無線網路運營商設置在哪裡設置方法 瀏覽:808
黃芪鑒別最簡單方法和用量 瀏覽:772
腦出血計算方法 瀏覽:691
降解紗線最佳方法 瀏覽:160
短期投資入賬價值計算方法 瀏覽:22
小米6屏幕重啟解決方法 瀏覽:438
蘋果7手機設置音樂鈴聲設置在哪裡設置方法 瀏覽:722
鉚釘的安裝方法 瀏覽:756
染頭發怎麼染方法視頻 瀏覽:842
腦袋瓜的食用方法 瀏覽:804
將苦味酊塗在手指上的治療方法是 瀏覽:332
切線方法視頻大全 瀏覽:555
軟燈帶安裝方法圖解 瀏覽:458
廚房的使用方法 瀏覽:526
濰坊青蘿卜種植方法 瀏覽:559
生物分析方法的維護 瀏覽:195