首页 > 解决方案 > 为什么我的数组序列化为字符串

问题描述

我创建了以下测试向量类:

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...."
  },
 ]

现在我不明白为什么“有效负载”被序列化为字符串而不是数组。
我的问题是:

  1. 这种字符串格式是什么(可能是 ASCII 码?),为什么用它来代替 byte[] 类型的表示?
  2. 有没有办法让“有效负载”字节 [] 以更易读的方式打印?

标签: c#serializationjsonconvert

解决方案


这种字符串格式是什么(可能是 ASCII 码?),为什么用它来代替 byte[] 类型的表示?

有关原始类型,请参阅json.Net 文档:

Byte[] 字符串(base 64 编码)

所以格式是base64。这可能会被使用,因为它是一种相当有效的二进制数据编码,每个字符编码 6 位。将值编码为数组将使用更多空间。

将图像或类似的数据块编码为字节数组有些常见。由于这些可能很大,因此尽可能减小尺寸是有用的。

有没有办法让“有效负载”字节 [] 以更易读的方式打印?

网上有各种 base64 转换器可以将其转换为十六进制、八进制、字符串或任何您喜欢以查看二进制数据的格式。但对于许多应用程序来说,它并不是很有用,因为二进制数据通常表示已经序列化的内容某种方式。


推荐阅读