在JSON.NET中序列化/反序列化字节数组

本文关键字:反序列化 字节 字节数 数组 序列化 JSON NET | 更新日期: 2023-09-27 18:25:04

我有一个简单的类,具有以下属性:

[JsonObject(MemberSerialization.OptIn)]
public class Person
{
    ...
    [JsonProperty(PropertyName = "Photograph"]
    public byte[] Photograph { get; set; }
    ...
}

但当我用图像填充Photography属性并通过http传输时,这就不起作用了。这听起来可能是一个简单的问题,但在网上搜索了几个小时后,我还没有找到解决方案,但是,如何在Json.NET中串行化/取消串行化字节数组?我需要什么属性标签,或者,我应该用另一种方式来做这件事吗?非常感谢!

在JSON.NET中序列化/反序列化字节数组

public static T Deserialize<T>(byte[] data) where T : class
{
    using (var stream = new MemoryStream(data))
    using (var reader = new StreamReader(stream, Encoding.UTF8))
        return JsonSerializer.Create().Deserialize(reader, typeof(T)) as T;
}

您可以将byte[]转换为字符串,然后使用JsonConvert方法获取对象:

var bytesAsString = Encoding.UTF8.GetString(bytes);
var person = JsonConvert.DeserializeObject<Person>(bytesAsString);

如果您使用LINQ到JSON,您可以执行以下操作:

JObject.Parse(Encoding.UTF8.GetString(data));

结果将是一个动态的CCD_ 1。

虽然这可能不是OP想要做的,但对于其他想要反序列化遇到此问题的byte[]的人来说,这可能会派上用场。

基于这个答案,您可以在net-core中使用以下答案:

using System.IO;
using System.Text.Json;
using System.Threading.Tasks;
namespace <MyNameSpace>
{
    public static class ByteArrayExtensions
    {
        public static async Task<T> Deserialize<T>(this byte[] data) where T : class
        {
            using (var stream = new MemoryStream(data))
            {
                return await JsonSerializer.DeserializeAsync(stream, typeof(T)) as T;
            }
        }
    }
}

这可能被认为在可读性方面具有优势:

var deserialized = await mySerializedByteArray.Deserialize<MyObjectClass>();