JsonConvert.DeserializeObject 尝试将 byte[] 反序列化为 IEnumerable 时抛出异常<byte>

问题描述 投票:0回答:1

下面的代码反序列化失败,并出现以下错误。

将值“AQID”转换为类型“System.Collections.Generic.IEnumerable`1[System.Byte]”时出错

public class ByteArrayTest
{
    public string SomeString { get; set; }
    public IEnumerable<byte> ByteArray { get; set; } 
} 

using Newtonsoft.Json;

[TestClass]
public class UnitTest10
{
    [TestMethod]
    public void TestTheByteArraySerialization()
    {
        var test = new ByteArrayTest { ByteArray = new byte[] { 1, 2, 3 }, SomeString = "testing" };
        var serializedData = JsonConvert.SerializeObject(test);
        //This line belows fails with an error of can't convert to IEnumerable<byte>
        var myByeArrayClass = JsonConvert.DeserializeObject<ByteArrayTest>(serializedData);
        Assert.AreEqual(test.ByteArray, myByeArrayClass.ByteArray);

    }
}

在我的特定情况下,我不拥有 ByteArrayTest 类,这只是问题的一个简单示例。 我想要一个不涉及修改 ByteArrayTest 类的解决方案。 理想情况下,我会将一些内容传递到 DeserializeObject<> 重载之一中以使其正常工作,但我不确定解决此异常的最佳方法

c# json.net
1个回答
0
投票

您不能指望 JsonConvert 神奇地创建接口的实现。

如果您的架构允许,您可以使用

List<byte>
byte[]
代替
IEnumerable<byte>
,或者您可以添加一个字段来连接 Json 序列化器并从中隐藏实际的
IEnumerable

private IEnumerable<byte> myBytes = null;

[JsonProperty("BytesArray")]
public string JsonBytes
{
    get 
    {
        // this may need tweaking, null checks etc
        return String.Join("", myBytes.Select(b => b.ToString("X2"))); 
    }
    set
    {
        byte[] bytes = Convert.FromBase64String(value);
        myBytes = bytes;
    } 
}

[JsonIgnore]
public IEnumerable<byte> BytesArray
{
    get { return myBytes; }
    set { myBytes = value; }
}

你可能可以提供一个转换器来实现同样的事情,但我想说这太多了,不需要。

有关

StringToByteArray
的几个实现的列表,请参阅这篇文章,我复制了最短的实现。

© www.soinside.com 2019 - 2024. All rights reserved.