using System.Collections.Generic;
using System.Diagnostics;
using System.Collections;
using System.Runtime.Serialization;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public VisualLed(int X, int Y)
public int X { get; set; }
public int Y { get; set; }
public override string ToString()
return string.Format("{0}: X = {1}, Y = {1}", base.ToString(), X, Y);
public class VisualLedPanel
private readonly Lazy<List<VisualLed>> _lazyVisualLeds = new Lazy<List<VisualLed>>(CreateVisualLeds);
public VisualLed this[int x, int y]
var result = VisualLeds.FirstOrDefault(f => f.X == x && f.Y == y);
public IEnumerable<VisualLed> VisualLeds
return _lazyVisualLeds.Value;
[JsonProperty("VisualLeds")]
VisualLed [] SerializableVisualLeds
return VisualLeds.ToArray();
if (value == null || value.Length == 0)
if (_lazyVisualLeds.IsValueCreated)
_lazyVisualLeds.Value.Clear();
_lazyVisualLeds.Value.Clear();
_lazyVisualLeds.Value.AddRange(value);
private static List<VisualLed> CreateVisualLeds()
var result = new List<VisualLed>();
for (var x = 0; x <= 7; x++)
for (var y = 0; y <= 7; y++)
result.Add(new VisualLed(x, y));
public static void Main()
Console.WriteLine(string.Format("Json.NET version: {0}.\n", typeof(JsonSerializer).Assembly.FullName));
var panel = new VisualLedPanel();
foreach (var led in panel.VisualLeds)
var json = JsonConvert.SerializeObject(panel, Formatting.Indented);
Console.WriteLine("Serialized VisualLedPanel: ");
var panel2 = JsonConvert.DeserializeObject<VisualLedPanel>(json);
var json2 = JsonConvert.SerializeObject(panel2, Formatting.Indented);
Console.WriteLine("Re-serialized VisualLedPanel: ");
if (!JToken.DeepEquals(JToken.Parse(json), JToken.Parse(json2)))
throw new InvalidOperationException("!JToken.DeepEquals(JToken.Parse(json), JToken.Parse(json2))");
Console.WriteLine("Original and re-serialized JSON are equivalent.");
if (!panel.VisualLeds.Select(led => led.ToString()).SequenceEqual(panel2.VisualLeds.Select(led => led.ToString())))
throw new InvalidOperationException("!panel.VisualLeds.Select(led => led.ToString()).SequenceEqual(panel2.VisualLeds.Select(led => led.ToString()))");
Console.WriteLine("Original and re-serialized VisualLeds are identical.");