以下代码在反序列化时失败,并出现以下错误。
将值“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&lt;&gt;之一。重载以使其工作,但我不确定解决此异常的最佳方法
答案 0 :(得分:0)
你不能指望JsonConvert神奇地为接口创建一个实现。
如果您的体系结构允许,您可以使用List<byte>
或byte[]
代替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
上this post的几个实施的列表,请复制最短的实现。