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

    版权申明: 本文原创首发于以下网站,您可以自由转载,但必须加入完整的版权声明 博客园:https://www.cnblogs.com/MogooStudio/ csdn博客:https://blog. ...

  2. C/C++ 中的头文件 stdio.h和stdlib.h

    stdio 就是指 “standard input & output" 标准输入输出 stdio.h所包含的函数: 文件访问fopenfreopenfflushfclose二进制输入 ...

  3. Cesium 加载 gltf 模型

    var viewer = new Cesium.Viewer('cesiumContainer', { /*帮助*/ navigationHelpButton: true, baseLayerPick ...

  4. (办公)记事本_Linux目录

    转载自菜鸟教程:https://www.runoob.com/linux/linux-system-contents.html /bin: bin是Binary的缩写, 这个目录存放着最经常使用的命令 ...

  5. Python如何动态的为对象添加方法或属性,__slots__用法

    代码示例如下: import types    #使用MethodType方法需要导入包 class test(object):  #定义 一个test类,包含name属性和f()方法 def __i ...

  6. pytorch 中改变tensor维度的几种操作

    具体示例如下,注意观察维度的变化 #coding=utf-8 import torch """改变tensor的形状的四种不同变化形式""" ...

  7. POJ-2018 Authors Register Update your info Authors ranklist

    Best Cow Fences Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 16945   Accepted: 5425 ...

  8. 软件测试价值提升之路- 第三章"拦截缺陷 "读书笔记

    作为一个测试团队,基本的职责是:测试产品,发现缺陷,报告结果,使每个版本的测试水准稳步提升.这些价值是作为一个测试所必须具备的,发挥这些价值能够让测试获得研发团队的基本信任.这类价值分为3部分: 1) ...

  9. Vim 宏实战操作

    宏的概念 什么是宏呢?英文名:macro,代表一串命令的集合. 示例操作文本 SELECT * FROM `edu_ocr_task` WHERE ((`userId`=284871) AND (`u ...

  10. Linux-正则、grep、sed学习笔记

    一.正则和grep 正则表达式的实现分成了两类: 基本正则表达式(BRE)和扩展的正则表达式(ERE). BRE 和 ERE 之间有什么区别呢?这是关于元字符的问题.BRE 可以辨别以下元字符: ^ ...