c# - 将 Newtonsoft JSON 序列化为字节数组
问题描述
我的目标是在字节数组的字段中发送包含标头对象和压缩数据的 JSON。
[JsonObject(MemberSerialization.OptOut)]
public class Message
{
public Message()
{
Header = new Header();
}
public Header Header { get; set; }
public byte[] Data { get; set; }
}
字节数组是 gzip 压缩的 JSON 对象,但这并不重要。我遇到的问题是,如果我序列化 JSON,它会转换为字符串,然后再转换回字节。问题是,消息大小增加了很多,因为序列化字节数组会将其转换为字符串表示形式。
我受到最大消息大小的限制,并且我有适当的压缩数据,但是当我发送包含字节数组和未压缩头中的压缩数据的 JSON 时,序列化 JSON 对象使我超出了消息大小限制。
是否有任何可靠的方法可以立即将 JSON 对象转换为字节数组。
var stringMessage = JsonConvert.SerializeObject(message,Formatting.None);
var bytes = Encoding.UTF8.GetBytes(stringMessage);
var stringMessage2 = JsonConvert.SerializeObject(message.TransportHeader, Formatting.None);
var bytes2 = Encoding.UTF8.GetBytes(stringMessage2);
Message eventMessage = new Message(bytes);
var bytes3= Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message.Transportdata));
压缩数据大小=243905
序列化后以字节为单位的完整 JSON = 325313
只是字节大小 = 90 的标头
只是压缩数据序列化并转换回字节 = 325210,(当数据被 JsonConvert.SerializeObject 序列化并产生字符串表示时,大小会增加)
它显然上升了很多,它是由字节数组引起的。
解决方案
我找到了一种方法来做我想做的事,它不完全是 JSON,而是 BSON 或也称为二进制 JSON。好吧,既然找到解决方案纯属运气,我不确定 BSON 有多知名。
无论如何,Newtonsoft 通过https://www.nuget.org/packages/Newtonsoft.Json.Bson/1.0.1上的 Newtonsoft.Json.Bson nuget 包支持它
一些序列化/反序列化的代码
foreach (var message in transportMessageList)
{
MemoryStream ms = new MemoryStream();
using (BsonDataWriter writer = new BsonDataWriter(ms))
{
JsonSerializer serializer = new JsonSerializer();
serializer.Serialize(writer, message);
}
var bsonByteArray = ms.ToArray();
Assert.True(bsonByteArray.Length!=0);
bsonList.Add(bsonByteArray);
}
var deserializdTransmortMessageList = new List<TransportMessage>();
foreach (var byteArray in bsonList)
{
TransportMessage message;
MemoryStream ms = new MemoryStream(byteArray);
using (BsonDataReader reader = new BsonDataReader(ms))
{
JsonSerializer serializer = new JsonSerializer();
message = serializer.Deserialize<TransportMessage>(reader);
}
Assert.True(message.Transportdata.Length!=0);
deserializdTransmortMessageList.Add(message);
}
您可以使用与 JSON 相同的类/对象,序列化压缩的字节数组不再导致大小增加。
请注意,Newtonsoft 网站上的 BSON 文档已经过时,目前仅列出不推荐使用的 api 调用。我的代码使用适当的非弃用 API 调用。
推荐阅读
- three.js - 在 Autodesk forge 查看器中升级三个 js 版本
- javascript - 无法插入数组reactjs
- mysql - 致命错误:mysql.h:安装mariadb时没有这样的文件或目录
- python-3.x - 在 Selenium 中使用 HTML 标签导航到元素
- enterprise-architect - 如何将自定义 xml 文件导入我的 EA 模型
- visual-studio - 将 .NET Framework 4.8 迁移到 .NET 5
- python - 我的 RelativeLayout 显然忽略了我的 pos_hint
- mysql - 关于mysql索引为什么不能给所有字段添加索引
- kotlin - jOOQ 从记录中返回错误的列值
- blazor-server-side - 如何使 Blazor Web 服务器应用程序侦听端点中的 POST 请求?