2012-02-18 9 views
16

のbyte配列:シリアライズ/デシリアライズ私は、次のプロパティを持つ単純なクラスを持っているJSON.NET

[JsonObject(MemberSerialization.OptIn)] 
public class Person 
{ 
    ... 
    [JsonProperty(PropertyName = "Photograph"] 
    public byte[] Photograph { get; set; } 
    ... 
} 

が、私はHTTPを介して画像や転送に写真のプロパティを移入する場合、これは動作しません。 これは簡単な質問のように聞こえるかもしれませんが、私は数時間オンラインで見ても解決策を見つけることはできませんでしたが、Json.NETでバイト配列をシリアル化/デシリアライズするにはどうすればよいですか?どのような属性タグが必要ですか?これを別の方法で行うべきですか? 多くの感謝!

あなたがオブジェクトを取得するには、その後JsonConvertメソッドを使用して文字列にバイト[]に変換することができます
+2

正しいオブジェクトのプロパティを設定する方法を見つけましたか?情報は多少断片化している。私はまったく同じ問題のためのクリーンなソリューションを探しています。 'byte []'は文字列ではなく配列に変換されるべきです。 –

+0

JSON.NETには、参照や型情報を保存するときに固定長配列に問題があると思います。 "$ type"メンバに型名を保存すると、固定長または読み込み専用の配列を逆シリアル化しようとするとエラーが発生します。代わりに 'List 'を使うか、JsonConverterを使ってbyte []メンバーをシリアライズしなければなりません。そのような基本的な事柄には問題があってはならないので、実際に修正する必要があります。 – Triynko

答えて

6

は:

var bytesAsString = Encoding.ASCII.GetString(bytes); 
var person = JsonConvert.DeserializeObject<Person>(bytesAsString); 
+0

OutOfMemory例外が発生するので、大きなオブジェクトに対してこのメ​​ソッドを使用することには注意してください。 Stream(s)を使用するメソッドは、OutOfMemoryシナリオを処理するのに適しています。 – Francis

13
public static T Deserialize<T>(byte[] data) where T : class 
{ 
    using (var stream = new MemoryStream(data)) 
    using (var reader = new StreamReader(stream, Encoding.UTF8)) 
     return JsonSerializer.Create().Deserialize(reader, typeof(T)) as T; 
} 
+4

私はこの答えが気に入っていますが、 'Encoding.UTF8'引数を' StreamReader'コンストラクタの2番目の引数に入れたいかもしれません。私はいつもデフォルトのエンコーディングを使用することについてちょっと心配しています。 – dana

+1

スニペットを 'Encoding.UTF8'に更新しました –

3

あなたがLINQ to JSONを使用している場合は、この操作を行うことができます。

JObject.Parse(Encoding.UTF8.GetString(data)); 

結果は動的JObjectになります。

これは正確にOPがやろうとしていたものではないかもしれませんが、byte[]をこの問題に遭遇して逆シリアル化しようとする人にとっては便利かもしれません。

関連する問題