JSON.NETは、バイトの配列を読み書きするBinaryConverter
を選択されたシリアル化する必要がどのくらいのものに依存します。 the sourceでJsonWriter
クラスのWriteValue
オペレーションを使用して、バイトの配列がBase-64として書き込まれることがわかります。
これを変更するには、あなたが期待する形式の配列を読み取り、書き込み、独自のコンバータ書くことができます:あなたがメンバーにJsonConverterAttribute
を適用することによって、これを使用することになり
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[]);
}
}
を:
[JsonConverter(typeof(ByteArrayConverter))]
public byte[] Data { get; set; }
私は 'int配列'のソリューションが大好きです。作業は偉大で簡単に実行できます。そのヒントのために多くのありがとうございます。 – Marcus
ブラボー。バイトはintに収まり、int []はバイトの配列です。もう一方のJSONバインディングを使用するWCFでは、JSONシリアル化DTOをbyte []プロパティで使用し、カスタムフォーマッタやBase64デコード/ストリームの書き込みを行わずに安全に逆シリアル化できます。 シリアライズされたJSONのサイズはかなり壮大ですが、機能します! –
これはバイト配列の8倍のメモリを使用しますが、必ずしも実行可能な解決策ではありません。 – FINDarkside