public class MyClass
{
public byte[] Bytes{get;set;}
}
MyClass obj = new MyClass();
obj.Bytes = new byte[]{1,22,44,55};
string s_result = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
// my s_result looks like {"Bytes":"KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="}
我想要像"字节"这样的结果:"1,22,44,55">
我确实通过在类中创建另一个 int[] 属性来解决此问题,例如
public class MyClass
{
[JsonIgnore]
public byte[] Bytes{get;set;}
public int[] MessageByte
{
get
{
if (this.Bytes == null)
return null;
int[] result = new int[this.Bytes.Length];
for (int i = 0; i < this.Bytes.Length; i++)
{
result[i] = this.Bytes[i];
}
return result;
}
}
}
有什么建议吗?
在文档中声明Byte[]
将被序列化为 Base64 编码字符串。 所以它正在按预期工作。
但是,您需要一个数字数组。 我认为您不能简单地将byte[]
更改为int[]
对吗?
您的解决方法实际上是处理它的正确方法,如果您有兴趣(并使用 C#6 或更高版本(,您可以将逻辑减少一点:
public int[] MessageBytes => Bytes?.Select(x => (int)x).ToArray() ?? new int[0];
如果 Bytes 为 null,这将"短路",并返回一个空的 int 数组,如果 Bytes 不为 null,它将把所有字节投射到 int,然后使其成为数组。
DotNetFiddle 不允许在 Roslyn 编译器中使用 nuget 包,因此我无法演示序列化。但是,此小提琴演示了我刚才演示的 LINQ 逻辑。
编辑
我认为链接的副本比仅仅做一个int[]
有更好的答案,在诉诸 int 数组之前尝试研究一下。