c# - 为什么我的数组序列化为字符串
问题描述
我创建了以下测试向量类:
public class TestVector
{
public UInt16 MaxBlockSize { get; }
public byte[] Payload { get; set; }
public TestVector(ushort maxBlockSize, byte[] payload)
{
MaxBlockSize = maxBlockSize;
Payload = payload;
}
}
在我的测试中,我填充了一个向量列表,定义如下:
private static HashSet<TestVector> myVectors = new HashSet<TestVector>();
然后使用 JsonConvert 序列化“myVectors”并将结果写入文件:
var jsonOuput = JsonConvert.SerializeObject(myVectors , new JsonSerializerSettings{ObjectCreationHandling = ObjectCreationHandling.Replace})
File.WriteAllText(@"e:\MyJson.json", jsonOuput);
这是一个 Json 典型输出(一个列表/哈希集由 2 个向量组成):
[
{
"MaxBlockSize": 256,
"Payload": "bjQSAAAAAABvNBIAAAAA..."
},
{
"MaxBlockSize": 256,
"Payload": "VjQSVzQSWDQS...."
},
]
现在我不明白为什么“有效负载”被序列化为字符串而不是数组。
我的问题是:
- 这种字符串格式是什么(可能是 ASCII 码?),为什么用它来代替 byte[] 类型的表示?
- 有没有办法让“有效负载”字节 [] 以更易读的方式打印?
解决方案
这种字符串格式是什么(可能是 ASCII 码?),为什么用它来代替 byte[] 类型的表示?
有关原始类型,请参阅json.Net 文档:
Byte[] 字符串(base 64 编码)
所以格式是base64。这可能会被使用,因为它是一种相当有效的二进制数据编码,每个字符编码 6 位。将值编码为数组将使用更多空间。
将图像或类似的数据块编码为字节数组有些常见。由于这些可能很大,因此尽可能减小尺寸是有用的。
有没有办法让“有效负载”字节 [] 以更易读的方式打印?
网上有各种 base64 转换器可以将其转换为十六进制、八进制、字符串或任何您喜欢以查看二进制数据的格式。但对于许多应用程序来说,它并不是很有用,因为二进制数据通常表示已经序列化的内容某种方式。
推荐阅读
- python - Python rrdtool.OperationalError:x-grid 格式无效
- javascript - 如何对数组进行分组并根据每个组返回一大块数组的单个属性?
- scala - 如何使火花流处理多批次?
- c# - 从已知索引中获取字符串,直到找到 \r\n
- r - 比较矩阵的行并删除项目
- php - 是否可以将成功的登录 cookie 转储到站点并绕过会话?
- java - 如果语句中的 SonarQube Java 'NullPointerException 可能会被抛出'
- asp.net-core - ASP.NET Core SignalR websocket 连接限制
- javascript - 防止空字符串成为数组的一部分
- c# - C# 将共享项目中的类与许多项目集成