寫代碼驗證了一下 .NET Core 中序列化對象輸出字節數大小,.NET Core 版本是 3.0.100-preview8-013656 ,對象屬性使用了 Guid 與 DateTime 類型,勝出的是 Newtonsoft.Json.Bson ,序列化輸出的字節數是 79 。
更新:后來同事用 MessagePack 對比了一下,結果讓人大吃一驚,MessagePack 序列化輸出的字節數只有31,甩其他序列化工具一條街。
//MessagePack
CompositeResolver.RegisterAndSetAsDefault(
UnsafeBinaryResolver.Instance,
StandardResolver.Instance);
var msgPack = MessagePackSerializer.Serialize(token);
Console.WriteLine(Encoding.ASCII.GetString(bytes));
Console.WriteLine(msgPack.Length);
//Length is 31
注:使用 MessagePack 時需要給每個屬性加上 [Key] 標記
代碼如下
[Serializable]
public class Token
{
public List<TokenItem> TokenItems { get; set; } = new List<TokenItem>();
public void Add(Guid userId)
{
TokenItems.Add(new TokenItem { UserId = userId, Expiration = DateTime.Now });
}
}
public class StringToken
{
public List<string> TokenItems { get; set; } = new List<string>();
public void Add(Guid userId)
{
TokenItems.Add(userId.ToString() + ";" + DateTime.Now.ToString("yyyy-MM-dd"));
}
}
[Serializable]
public class TokenItem
{
public Guid UserId { get; set; }
public DateTime Expiration { get; set; }
}
class Program
{
static void Main(string[] args)
{
var token = new Token();
token.Add(Guid.NewGuid());
//System.Text.Json in .NET Core
var json = System.Text.Json.JsonSerializer.Serialize(token);
Console.WriteLine(json);
var byteCount = Encoding.ASCII.GetByteCount(json);
Console.WriteLine(byteCount);
//Length is 115
//Json.NET
json = JsonConvert.SerializeObject(token);
Console.WriteLine(json);
byteCount = Encoding.ASCII.GetByteCount(json);
Console.WriteLine(byteCount);
//Length is 115
//Newtonsoft.Json.Bson
using var ms = new MemoryStream();
using var writer = new BsonDataWriter(ms);
var serializer = new Newtonsoft.Json.JsonSerializer();
serializer.Serialize(writer, token);
var bytes = ms.ToArray();
Console.WriteLine(Encoding.ASCII.GetString(bytes));
Console.WriteLine(bytes.Length);
//Length is 79
var data = Convert.ToBase64String(bytes);
Console.WriteLine(data);
Console.WriteLine(data.Length);
//Length is 108
//BinaryFormatter
using var ms2 = new MemoryStream();
new BinaryFormatter().Serialize(ms2, token);
bytes = ms2.ToArray();
Console.WriteLine(Encoding.ASCII.GetString(bytes));
Console.WriteLine(bytes.Length);
//Length is 756
//Newtonsoft.Json.Bson with StringToken
var stringToken = new StringToken();
stringToken.Add(Guid.NewGuid());
using var ms3 = new MemoryStream();
using var writer3 = new BsonDataWriter(ms3);
serializer.Serialize(writer3, stringToken);
bytes = ms3.ToArray();
Console.WriteLine(Encoding.ASCII.GetString(bytes));
Console.WriteLine(bytes.Length);
//Length is 77
data = Convert.ToBase64String(bytes);
Console.WriteLine(data);
Console.WriteLine(data.Length);
//Length is 104
}
}
