zoukankan      html  css  js  c++  java
  • .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
        }
    }
    
  • 相关阅读:
    子网掩码
    一个正则表达式:该正则表达式标示了后面有数字,但又不能是某特定数字的情况
    C++:STL标准入门汇总
    SOAP
    uva10236The Fibonacci Primes
    uvalive3209City Game
    uvalive3695Distant Galaxy
    uva11549Calculator Conundrum
    uva11078Open Credit System
    uvalive3295Counting Triangles
  • 原文地址:https://www.cnblogs.com/dudu/p/11384829.html
Copyright © 2011-2022 走看看