using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Collections.ObjectModel;
using System.Text.Json.Serialization;
public Repository(string gitDirectory) => this.GitDirectory = new DirectoryInfo(gitDirectory);
public Repository(DirectoryInfo gitDirectory) => this.GitDirectory = gitDirectory ?? throw new ArgumentNullException(nameof(gitDirectory));
[JsonConverter(typeof(DirectoryInfoConverter))]
public DirectoryInfo GitDirectory { get; }
public class DirectoryInfoConverter : JsonConverter<DirectoryInfo>
public override DirectoryInfo Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) =>
new DirectoryInfo(reader.GetString());
public override void Write(Utf8JsonWriter writer, DirectoryInfo value, JsonSerializerOptions options) =>
writer.WriteStringValue(value.ToString());
public abstract class GitObject
public Repository Repository { get; set; }
public abstract string Serialize();
public abstract void Deserialize(string data);
public class Blob : GitObject
public string Data { get; set; }
public Blob(Repository repository) => this.Repository = repository ?? throw new ArgumentNullException(nameof(repository));
public static Blob CreateFromDataFile(Repository repository, string dataFileName) =>
Data = File.ReadAllText(dataFileName),
public static Blob CreateFromDataConents(Repository repository, string data) =>
public override string Serialize() => JsonSerializer.Serialize(this);
public override void Deserialize(string data)
Blob blobData = JsonSerializer.Deserialize<Blob>(data);
this.Repository = blobData.Repository;
this.Data = blobData.Data;
public static void Test()
var codeFileName = "Question72000907-code.txt";
File.WriteAllText(codeFileName, GetCode());
var repository = new Repository(Directory.GetCurrentDirectory());
var file = new FileInfo(Path.Combine(repository.GitDirectory.FullName, codeFileName));
var firstBlob = GitObject.Blob.CreateFromDataFile(repository, file.FullName);
var json = firstBlob.Serialize();
var secondBlob = new GitObject.Blob(repository);
secondBlob.Deserialize(json);
var json2 = secondBlob.Serialize();
Console.WriteLine(json2);
Assert.AreEqual(json, json2);
Assert.AreEqual(firstBlob.Data, secondBlob.Data);
File.Delete(codeFileName);
static string GetCode() => @"namespace HelloWorld
static void Main(string[] args)
System.Console.WriteLine(""Hello World!"");
public static void Main()
Console.WriteLine("Environment version: {0} ({1}), {2}", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , Environment.Version, Environment.OSVersion);
Console.WriteLine("System.Text.Json version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");