JSON.NET jest wybranie BinaryConverter
do odczytu i zapisu tablicę bajtów. widać the source że wykorzystuje operację WriteValue
od klasy JsonWriter
z tablicy bajtów, które powoduje ich być zapisywane jako base-64.
Aby to zmodyfikować, można napisać własny konwerter, który odczytuje i zapisuje tablicę w formacie można oczekiwać:
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[]);
}
}
byłoby to wykorzystać stosując JsonConverterAttribute
członkowi:
[JsonConverter(typeof(ByteArrayConverter))]
public byte[] Data { get; set; }
Uwielbiam rozwiązanie "int Array". Praca jest świetna i łatwa do wdrożenia. Bardzo dziękuję za tę podpowiedź. – Marcus
Bravo. Bajt pasuje do int, a całe int [] jest tablicą bajtów. WCF z powiązaniem JSON na drugim końcu może wykonać szeregowy DTO JSON z właściwością byte [] i bezpiecznie deserializować go bez żadnych niestandardowych formaterów lub dekodowania base64/zapisu Stream. Rozmiar serializowanego JSON jest całkiem wspaniały, ale działa! –
Używa jednak 8-krotnej pamięci tablicy bajtów, więc nie zawsze jest to wykonalne rozwiązanie. – FINDarkside