2017-12-21 12 views
1

静的変数のシリアル化がデフォルトで機能しないのはなぜですか?this questionへの回答は、正しい属性で可能であることを示しているようです。JSON静的プロパティシリアル化が機能しない

私のクラスには、次のようになります。

[JsonObject(MemberSerialization.OptIn)] 
public class c 
{ 
    [JsonProperty] 
    public static double x{ get; set; } = 70; 
    [JsonProperty] 
    public static double y{ get; set; } = 36; 
    [JsonProperty] 
    public static double z{ get; set; } = 12; 
} 

そして、それは私が[JsonObject(MemberSerialization.OptIn)]属性でとせずに、それを試してみた

StatePersister.SaveState(new c(), fileName); 


public static void SaveState(Object o, string savePath, FileFormat? format = null) 
{ 
    DataContractJsonSerializerSettings settings = new DataContractJsonSerializerSettings { UseSimpleDictionaryFormat = true }; 
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(o.GetType(), settings); 
    using (var stream = File.Create(savePath)) 
    { 
     using (var writer = JsonReaderWriterFactory.CreateJsonWriter(stream, Encoding.UTF8, true, true, "\t")) 
     { 

      serializer.WriteObject(writer, o); 
      writer.Flush(); 
     } 
    } 
} 

を通じてJSON.netに入り、いずれかの方法で「{}」だけを含むファイルを取得します

コードを実行するオブジェクトがインスタンス化されていることがわかりました。正しい情報。

+0

なぜあなたはとにかく静的なプロパティを持っていますか?代わりにそれらを非静的にしてみませんか? –

+0

誰もが静的変数を使用する同じ種類の理由から。コード内のどこからでもアクセス可能な変数が必要です。複数のインスタンスを持つ必要はありません。単一のインスタンスを渡すことは面倒であり、多くのエラーの可能性を開く可能性があります。どこからでも作成されたこれらのプロパティの変更は、プログラム全体で同期させる必要があります。 – ccwscott

答えて

2

Json.Net属性を使用していますが、Json.Netシリアライザを使用していません。 DataContractJsonSerializerJson.Netではなく、.Net Frameworkの一部です。したがって、[JsonObject][JsonProperty]という属性を使用することはできません。さらに、DataContractJsonSerializerは、静的メンバーのシリアル化をサポートしていません(正しい属性を使用しても)(それぞれ[DataContract]および[DataMember])。静的メンバーをシリアル化する場合は、代わりにJson.NetのJsonSerializerを使用する必要があります。

using (var stream = File.Create(savePath)) 
using (TextWriter textWriter = new StreamWriter(stream, Encoding.UTF8)) 
using (JsonWriter jsonWriter = new JsonTextWriter(textWriter)) 
{ 
    JsonSerializer serializer = new JsonSerializer(); 
    serializer.Serialize(jsonWriter, o); 
} 

フィドル:https://dotnetfiddle.net/lYzDEE

注:あなたのJSONが小さい場合には、あなたが本当にストリームにする必要はありません。あなたはこれにあなたのコードを簡略化することができます:

string json = JsonConvert.SerializeObject(o); 
File.WriteAllText(savePath, json, Encoding.UTF8); 
+0

それはうまくいきました。私が作ったレガシーメソッドを呼び出すだけでした。新しいものはJSON.netに更新されたもので、うまくいきました。私たちが輸出しているデータも一般的にはかなり大きいです。私はちょうどその投稿のサブサンプルを提供しました。 – ccwscott

関連する問題