using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Runtime.Serialization;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public string Name { get; set; }
public FileInfo File { get; set; }
public class FileInfoConverter : JsonConverter<FileInfo>
public override void WriteJson(JsonWriter writer, FileInfo? value, JsonSerializer serializer) =>
serializer.Serialize(writer, FileInfoDTO.FromFileInfo(value));
public override FileInfo? ReadJson(JsonReader reader, Type objectType, FileInfo? existingValue, bool hasExistingValue, JsonSerializer serializer) =>
serializer.Deserialize<FileInfoDTO>(reader)?.ToFileInfo();
public string OriginalPath { get; set; } = "";
public string FullPath { get; set; } = "";
public FileInfoDTO(FileInfo info)
ArgumentNullException.ThrowIfNull(info);
OriginalPath = info.ToString();
FullPath = info.FullName;
public FileInfo ToFileInfo() => new FileInfo(OriginalPath);
public static FileInfoDTO? FromFileInfo(FileInfo? fileInfo) => fileInfo == null ? null : new FileInfoDTO(fileInfo);
public static void Test()
var fileName = "Question56670748.txt";
File.WriteAllText(fileName, "");
var settings = new JsonSerializerSettings
Converters = { new FileInfoConverter() },
var json2 = Test(fileName, settings);
private static string Test(string fileName, JsonSerializerSettings settings)
File = new FileInfo(fileName)
var json = JsonConvert.SerializeObject(root, Formatting.Indented, settings);
var root2 = JsonConvert.DeserializeAnonymousType(json, root, settings);
var json2 = JsonConvert.SerializeObject(root2, Formatting.Indented, settings);
Console.WriteLine(json2);
Assert.Equal(true, json == json2 && root.File.Name == root2.File.Name);
public static void Main()
Console.WriteLine("Environment version: " + Environment.Version);
Console.WriteLine("{0} version: {1}", typeof(JsonSerializer).Namespace, typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");