【问题标题】:Why is my array serialising into a string [duplicate]为什么我的数组序列化为字符串[重复]
【发布时间】:2020-12-10 14:33:09
【问题描述】:

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

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输出(一个list/Hashset由2个向量组成):

[
 {
    "MaxBlockSize": 256,
    "Payload": "bjQSAAAAAABvNBIAAAAA..."
  },
  {
    "MaxBlockSize": 256,
    "Payload": "VjQSVzQSWDQS...."
  },
 ]

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

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

【问题讨论】:

  • 你希望它是一个数组,究竟是什么?而什么Bytes是二进制数据,但是JSON是文本格式,所以它必须将二进制数据转换成文本表示。我很确定这将是一个 base64 字符串。你想要什么“可读”的二进制数据表示?为什么这很重要? JSON 并不是真正供人类使用的。只要您可以再次反序列化它(可以),那么它就无关紧要了。
  • 通常,当我序列化一个对象时,我会得到组成数组的实际值,而不是字符串。例如。当我有一个 double[] 时,我会得到一个 doubles 列表。
  • 这是因为双精度可以直接以文本格式表示(即数字的书面表示)。我猜你的字节数组的另一种方式可能是一大串 0 和 1,但是,这真的对你有帮助吗?你到底希望看到什么?另请参阅我对上面评论的编辑,关于 JSON 不打算被人类阅读的部分。就此而言,这同样适用于原始二进制数据。
  • @ADyson,问题是我需要通过眼睛对这些向量与实际字节数组进行比较。这些字符串是不可读的。但我明白你的意思,谢谢
  • stackoverflow.com/a/15228384/7565574 描述了如何配置 NewtonSoft JSON 以像任何其他数组一样序列化字节数组。

标签: c# serialization jsonconvert


【解决方案1】:

这种字符串格式是什么(可能是 ASCII 码?)以及为什么使用它而不是 byte[] 类型的表示形式?

原始类型见json.Net documentation

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

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

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

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

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

【讨论】:

  • 感谢您的澄清,这是有道理的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多