using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Collections.ObjectModel;
using System.Runtime.Serialization;
using System.ComponentModel;
using System.Globalization;
using System.Collections.Specialized;
using System.Runtime.Serialization.Formatters;
using System.Data.SqlTypes;
using System.ComponentModel.DataAnnotations;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public string Value { get; set; }
public Game(int edition, string date, GameType nameType)
: this(edition, date, nameType, new List<Question>())
public Game(int edition, string date, GameType nameType, List<Question> questions)
this.NameType = nameType;
this.Questions = questions;
public int Edition { get; private set; }
return NameType.ToString();
public string Date { get; private set; }
[JsonConverter(typeof(StringEnumConverter))]
public GameType NameType { get; private set; }
public List<Question> Questions { get; private set; }
public static void Main()
var game = new Game(32, DateTime.Today.ToString(), GameType.Complex)
Questions = { new Question { Value = "question 1 value" } },
var json = JsonConvert.SerializeObject(game, Formatting.Indented);
var game2 = JsonConvert.DeserializeObject<Game>(json);
var json2 = JsonConvert.SerializeObject(game2, Formatting.Indented);
Console.WriteLine(json2);
if (!JToken.DeepEquals(JToken.Parse(json), JToken.Parse(json2)))
Console.WriteLine("Json deserialized and re-serialized WITH DATA LOSS.");
throw new InvalidOperationException("!JToken.DeepEquals(JToken.Parse(json), JToken.Parse(json2))");
Console.WriteLine("Json deserialized and re-serialized successfully.");