.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
}
}
.NET Core 序列化对象输出字节数大小比较的更多相关文章
- sizeof 计算 struct 占字节数的方法总结
矛盾焦点: 1.结构体的内存对齐方式 字节对齐的目的: 1.提高CPU存储变量的速度 计算的核心点(默认对齐方式): 1.结构体内的每一个成员的起始地址跟结构体起始地址的偏移量要刚好是自己字节数的整数 ...
- 面试题之java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况
题目:10. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输 ...
- java根据输入的字符串和字节数来截取,输出对应字节数的字符串
public class Test { //要进行截取操作的字符串 static String ss; //截取的字符串的字节数 static int n; public static void ma ...
- 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
一.需要分析 1.输入为一个字符串和字节数,输出为按字节截取的字符串--->按照字节[byte]截取操作字符串,先将String转换成byte类型 2.汉字不可以截半--->汉字截半的话对 ...
- 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 ...
- wc - 输出文件中的字节数、单词数、行数
SYNOPSIS 总览 wc [选项列表]... [文件名列表]... DESCRIPTION 描述 对每个文件输出行.单词.和字节统计数,如果指定了多于一个文件则还有一个行数的总计.没有指定文件或指 ...
- 获取JAVA对象占用的内存大小
介绍两种获取JAVA对象内存大小的方法. 第一种:Instrumentation 简介: 使用java.lang.instrument 的Instrumentation来获取一个对象的内存大小.利用I ...
- Android使用HttpURLConnection通过POST方式发送java序列化对象
使用HttpURLConnection类不仅可以向WebService发送字符串,还可以发送序列化的java对象,实现Android手机和服务器之间的数据交互. Android端代码: public ...
- Java各种类型占用的字节数
Java 占用字节数 转自:http://www.blogjava.net/stevenjohn/archive/2013/10/18/405416.html 数据类型 大小(二进制位数) 范围 默认 ...
随机推荐
- mysql与oracle的语法对比
数据类型 编号 ORACLE MYSQL 注释 1 NUMBER int / DECIMAL DECIMAL就是NUMBER(10,2)这样的结构INT就是是NUMBER(10),表示整型:MYSQL ...
- Abp zero 登录 添加腾讯云验证码
腾讯云验证码是为网页.App.小程序开发者提供的安全验证服务,基于腾讯多年的大数据积累和人工智能决策引擎,构建智能分级验证模型,最大程度保护业务安全的同时,提供更精细化的用户体验. 腾讯云--> ...
- 使用C#面向对象实现简易计算器(简单工厂模式)
操作流程: 1. 新建Operation类 2. 新建OperationAdd类,并继承Operation类 3. 新建OperationSub类,并继承Operation类 4. 新建Operati ...
- Java之继承性
为什么要有继承 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可.其中,多个类可以称为子类,单独那一个类称为父类.超类或者基类. 继 ...
- 【洛谷5643】[PKUWC2018] 随机游走(Min-Max容斥+待定系数法+高维前缀和)
点此看题面 大致题意: 从一个给定点出发,在一棵树上随机游走,对于相邻的每个点均有\(\frac 1{deg}\)的概率前往.多组询问,每次给出一个点集,求期望经过多少步能够访问过点集内所有点至少一次 ...
- Web安全测试学习笔记-DVWA-存储型XSS
XSS(Cross-Site Scripting)大致分为反射型和存储型两种,之前对XSS的认知仅停留在如果网站输入框没有屏蔽类似<script>alert('ok')</scrip ...
- Java replace() 方法 替换字符 也可用于 js 中
JAVA中: public class Test { public static void main(String args[]) { String Str = new String("he ...
- Concepts & Implementation of PLs
http://perugini.cps.udayton.edu/teaching/courses/Spring2015/cps352/index.html#lecturenotes Programmi ...
- 拥抱webpack4,有效缩减构建时间57%+
背景 最近有感觉到,随着系统模块数量的增加,wepack编译打包的速度越来越慢,于是我想给项目做一下优化升级,也借此机会系统地学习一下webpack4. 升级过程 当前版本 "depende ...
- ASP.NET图片上传和截取
一.介绍:图片的上传直接使用ajax就可以了,截取图片的话使用到Jcrop插件. 图片上传资料:https://www.jb51.net/article/87654.htm 截取图片插件:http:/ ...