【发布时间】:2025-12-31 18:50:01
【问题描述】:
鉴于这个简单的类:
class HasBytes
{
public byte[] Bytes { get; set; }
}
我可以通过 JSON.NET 将其放入,这样字节数组就是 base-64 编码的:
var bytes = new HasBytes { Bytes = new byte[] { 1, 2, 3, 4 } };
var json = JsonConvert.SerializeObject(bytes);
然后我可以用这种稍微有点过于复杂的方式再读一遍:
TextReader textReader = new StringReader(json);
JsonReader jsonReader = new JsonTextReader(textReader);
var result = (HasBytes)JsonSerializer.Create(null)
.Deserialize(jsonReader, typeof(HasBytes));
一切都好。但是如果我先把jsonReader的内容变成JToken:
var jToken = JToken.ReadFrom(jsonReader);
然后通过将其包装在JTokenReader 中,将其转回JsonReader:
jsonReader = new JTokenReader(jToken);
然后反序列化抛出异常:“Expected bytes but got string”。
新的 JsonReader 不应该在逻辑上等同于原来的吗?为什么“原始”JsonTextReader 能够将字符串视为 base-64 字节数组,而 JTokenReader 版本却没有?
【问题讨论】:
标签: serialization bytearray json.net