using MongoDB.Bson.Serialization;
using MongoDB.Bson.Serialization.Attributes;
using Newtonsoft.Json.Converters;
using System.Text.Json.Serialization;
using N = Newtonsoft.Json;
using SS = System.Text.Json.Serialization;
using S = System.Text.Json;
public WidgetType Type { get; }
public string Name { get; }
public DateTime ProducedOn { get; }
public DateTime CreatedAt { get; }
public string CreatedBy { get; }
public class DomainWidget : IWidget
public int Id { get; set; }
public WidgetType Type { get; set; }
public string Name { get; set; }
public DateTime ProducedOn { get; set; }
public class JsonWidget : IWidget, IEntity
public int Id { get; set; }
[N.JsonConverter(typeof(StringEnumConverter))]
public WidgetType Type { get; set; }
public string Name { get; set; }
public DateTime ProducedOn { get; set; }
public DateTime CreatedAt { get; set; }
public string CreatedBy { get; set; }
public class JsonDomainWidgetBad : IWidget
public int Id { get; set; }
[N.JsonConverter(typeof(StringEnumConverter))]
public WidgetType Type { get; set; }
public string Name { get; set; }
public DateTime ProducedOn { get; set; }
public class JsonWidgetBad : JsonDomainWidgetBad, IEntity
public DateTime CreatedAt { get; set; }
public string CreatedBy { get; set; }
public class NewJsonWidget : IWidget, IEntity
public int Id { get; set; }
[SS.JsonConverter(typeof(JsonStringEnumConverter))]
public WidgetType Type { get; set; }
public string Name { get; set; }
public DateTime ProducedOn { get; set; }
public DateTime CreatedAt { get; set; }
public string CreatedBy { get; set; }
public class MongoWidget : IWidget, IEntity
public int Id { get; set; }
[BsonElement("widgetType")]
public WidgetType Type { get; set; }
public string Name { get; set; }
public DateTime ProducedOn { get; set; }
public DateTime CreatedAt { get; set; }
public string CreatedBy { get; set; }
public static void Main()
var jsonWidget = new JsonWidget
ProducedOn = DateTime.Now,
CreatedAt = DateTime.Now,
var json = N.JsonConvert.SerializeObject(jsonWidget, Formatting.Indented);
var jsonWidgetBad = new JsonWidgetBad
ProducedOn = DateTime.Now,
CreatedAt = DateTime.Now,
var jsonBad = N.JsonConvert.SerializeObject(jsonWidgetBad, Formatting.Indented);
Console.WriteLine(jsonBad);
var newJsonWidget = new NewJsonWidget
ProducedOn = DateTime.Now,
CreatedAt = DateTime.Now,
var newJson = S.JsonSerializer.Serialize(newJsonWidget, new JsonSerializerOptions { WriteIndented = true });
Console.WriteLine(newJson);
var mongoWidget = new MongoWidget
ProducedOn = DateTime.Now,
CreatedAt = DateTime.Now,
var memoryStream = new System.IO.MemoryStream();
var bsonWriter = new BsonBinaryWriter(memoryStream);
BsonSerializer.Serialize(bsonWriter, mongoWidget.GetType(), mongoWidget);
Console.WriteLine(Encoding.Default.GetString(memoryStream.GetBuffer()));
Console.WriteLine(BitConverter.ToString(memoryStream.GetBuffer()));