0

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

将值“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<> 重载之一以使其正常工作,但我不确定解决此异常的最佳方法

4

1 回答 1

0

你不能指望 JsonConvert 神奇地为接口创建一个实现。

如果您的体系结构允许,您可以使用List<byte>orbyte[]代替,IEnumerable<byte>或者您可以添加一个字段来接口 Json 序列化程序并隐藏您的实际 IEnumerable 。

private IEnumberable<byte> myBytes = null;

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

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

您可能可以提供一个转换器来实现相同的目标,但我会说它没有必要摆弄太多。

有关StringToByteArray查看这篇文章的几个实现的列表,我复制了最短的实现。

于 2013-07-03T16:43:17.483 回答