JSON.NET là chọn BinaryConverter
để đọc và viết một mảng byte. Bạn có thể thấy trong the source rằng nó sử dụng hoạt động WriteValue
trên lớp JsonWriter
với mảng byte khiến chúng được ghi thành Base-64.
Để sửa đổi này, bạn có thể viết Chuyển đổi riêng của bạn mà đọc và viết một mảng trong các định dạng mà bạn mong đợi:
public class ByteArrayConverter : JsonConverter
{
public override void WriteJson(
JsonWriter writer,
object value,
JsonSerializer serializer)
{
if (value == null)
{
writer.WriteNull();
return;
}
byte[] data = (byte[])value;
// Compose an array.
writer.WriteStartArray();
for (var i = 0; i < data.Length; i++)
{
writer.WriteValue(data[i]);
}
writer.WriteEndArray();
}
public override object ReadJson(
JsonReader reader,
Type objectType,
object existingValue,
JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartArray)
{
var byteList = new List<byte>();
while (reader.Read())
{
switch (reader.TokenType)
{
case JsonToken.Integer:
byteList.Add(Convert.ToByte(reader.Value));
break;
case JsonToken.EndArray:
return byteList.ToArray();
case JsonToken.Comment:
// skip
break;
default:
throw new Exception(
string.Format(
"Unexpected token when reading bytes: {0}",
reader.TokenType));
}
}
throw new Exception("Unexpected end when reading bytes.");
}
else
{
throw new Exception(
string.Format(
"Unexpected token parsing binary. "
+ "Expected StartArray, got {0}.",
reader.TokenType));
}
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(byte[]);
}
}
Bạn sẽ sử dụng này bằng cách áp dụng JsonConverterAttribute
cho thành viên:
[JsonConverter(typeof(ByteArrayConverter))]
public byte[] Data { get; set; }
Nguồn
2013-03-05 15:58:47
Tôi thích giải pháp 'int Array'. Công việc tuyệt vời và đơn giản để thực hiện. Rất cám ơn vì gợi ý đó. – Marcus
Bravo. Một byte phù hợp với một int, và toàn bộ int [] là một mảng các byte. WCF với một ràng buộc JSON ở đầu kia có thể lấy một DTO được tuần tự hóa JSON với thuộc tính byte [] và an toàn deserialize nó mà không có bất kỳ trình định dạng tùy chỉnh hoặc giải mã base64/ghi dòng. Kích thước của JSON được tuần tự hóa là khá tuyệt vời, nhưng nó hoạt động! –
Nó sẽ sử dụng 8 lần bộ nhớ của mảng byte, vì vậy không phải luôn luôn là một giải pháp khả thi. – FINDarkside