写代码验证了一下 .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
}
}

.NET Core 序列化对象输出字节数大小比较的更多相关文章

  1. sizeof 计算 struct 占字节数的方法总结

    矛盾焦点: 1.结构体的内存对齐方式 字节对齐的目的: 1.提高CPU存储变量的速度 计算的核心点(默认对齐方式): 1.结构体内的每一个成员的起始地址跟结构体起始地址的偏移量要刚好是自己字节数的整数 ...

  2. 面试题之java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况

    题目:10. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输 ...

  3. java根据输入的字符串和字节数来截取,输出对应字节数的字符串

    public class Test { //要进行截取操作的字符串 static String ss; //截取的字符串的字节数 static int n; public static void ma ...

  4. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。

    一.需要分析 1.输入为一个字符串和字节数,输出为按字节截取的字符串--->按照字节[byte]截取操作字符串,先将String转换成byte类型 2.汉字不可以截半--->汉字截半的话对 ...

  5. java算法面试题:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个, 如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。

    package com.swift; import java.util.Scanner; public class Hanzi_jiequ { public static void main(Stri ...

  6. wc - 输出文件中的字节数、单词数、行数

    SYNOPSIS 总览 wc [选项列表]... [文件名列表]... DESCRIPTION 描述 对每个文件输出行.单词.和字节统计数,如果指定了多于一个文件则还有一个行数的总计.没有指定文件或指 ...

  7. 获取JAVA对象占用的内存大小

    介绍两种获取JAVA对象内存大小的方法. 第一种:Instrumentation 简介: 使用java.lang.instrument 的Instrumentation来获取一个对象的内存大小.利用I ...

  8. Android使用HttpURLConnection通过POST方式发送java序列化对象

    使用HttpURLConnection类不仅可以向WebService发送字符串,还可以发送序列化的java对象,实现Android手机和服务器之间的数据交互. Android端代码: public ...

  9. Java各种类型占用的字节数

    Java 占用字节数 转自:http://www.blogjava.net/stevenjohn/archive/2013/10/18/405416.html 数据类型 大小(二进制位数) 范围 默认 ...

随机推荐

  1. JS高级教程

    JS高级教程 JS高级教程

  2. dedecmsV5.7 百度编辑器ueditor 多图上传 在线管理 排序问题

    问题:dedecms后台百度编辑器ueditor的多图上传-在线管理的图片排序有问题,想把这个顺序调成按照文件修改时间倒序来展示 解决方法: 1.打开/include/ueditor/php/acit ...

  3. katalon Studio之WebUi自动化测试视频教程持续更新

    通知...通知...通知... 为了更好的把katalon Studio自动化测试工具推广给大家,最近在B站中开通了视频专栏,地址如下: https://www.bilibili.com/video/ ...

  4. 监控利器-Prometheus安装与部署+实现邮箱报警

    Prometheus(普罗米修斯)监控 环境准备: 三台docker主机(centos7):docker01:172.16.1.30部署服务:Prometheus server,Grafana,Nod ...

  5. 【pycharm】Unable to save settings: Failed to save settings. Please restart PyCharm解决

    1.Unable to save settings: Failed to save settings. Please restart PyCharm解决 将工程的.idea目录删掉,重启pycharm ...

  6. canvas绘制线条详解

    canvas详解----绘制线条 <!DOCTYPE html> <html> <head> <title>canvas详解</title> ...

  7. VS出现未加载wntdll.pdb的解决办法

    无缘无故出现了未加载wntdll.pdb的的错误,不知道原因是什么,但找到了解决方法.在调试中选择选项,然后选择调试->符号,勾选Microsoft符号服务器,确定.重新生成项目时会有各种加载, ...

  8. 火车票买不到?看我用python监控票源

    同事说最近火车票难买,我就帮他用个脚本监控 一下. 最近高铁票比较难买,还有什么候补.要不停的刷,才有时候可以捡漏.有时候明明候补了,到快开车告诉你余票不足,候补失败. 凡事预则立,我打算写个脚本提前 ...

  9. koa2 从入门到进阶之路 (七)

    之前的文章我们介绍了一下 koa koa-static静态资源中间件,本篇文章我们来看一下 koa 中 cookie 和 session 的使用. cookie 是存储于访问者的计算机中的变量.可以让 ...

  10. Java题库——Chapter12 异常处理和文本IO

    异常处理 1)What is displayed on the console when running the following program? class Test { public stat ...