.NET Core 序列化对象输出字节数大小比较

写代码验证了一下 .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
    }
}
posted @ 2019-08-20 18:40 dudu 阅读(...) 评论(...) 编辑 收藏