Marvin-Brouwer / FluentSerializer

A fluent take on serializer libraries
Apache License 2.0
20 stars 1 forks source link

Use source generator instead of in-memory collection #179

Open Marvin-Brouwer opened 2 years ago

Marvin-Brouwer commented 2 years ago

Discussed in https://github.com/Marvin-Brouwer/FluentSerializer/discussions/69

Originally posted by **Marvin-Brouwer** February 9, 2022 We'd like to research the possibility of generating the JSON/XML/whatever mappings on build instead of reflecting this on startup. For example, change this: ```CS public sealed class ProjectProfile : OpenAirSerializerProfile { public override void Configure() { For( attributeNamingStrategy: Names.Use.SnakeCase, tagNamingStrategy: Names.Use.PascalCase ) .Child(project => project.Name) .Child(project => project.LastUpdate, namingStrategy: Names.Equal("updated"), converter: Converters.Use.OpenAirDate) .Child(project => project.Active, converter: Converters.Use.StringBitBoolean) .Child(project => project.CustomDate, namingStrategy: Names.Use.CustomFieldNames, converter: Converters.Use.SimpleDate) .Child(project => project.RateCardId); } } ``` Into this: ```CS public sealed class GeneratedSerializer { public string? Serialize(object? objectToSerialize) { if(object is null) return null) if(objectToSerialize is FullNamespace.Project)) return ProjectSerializer.Serialize(objectToSerialize); // ... throw new ClassMapNotFoundException(objectToSerialize.GetType()); } } ``` ```CS public static class ProjectSerializer { public static string? Serialize(Project objectToSerialize, ISerializerContext context) { const projectName = Names.Use.PascalCase(objectToSerialize.GetType(), context); var dataConatiner = new XObject(projectName, new XmlBuilder.Element( Names.Use.SnakeCase(objectToSerialize.GetType().GetProperty(nameof(objectToSerialize.Name)), context), Converters.Use.Convertible(objectToSerialize.Name, context)), new XmlBuilder.Element( Names.Equal("updated")(nameof(objectToSerialize.LastUpdate), context), Converters.Use.OpenAirDate(objectToSerialize.LastUpdate)), new XmlBuilder.Element( Names.Use.SnakeCase(objectToSerialize.GetType().GetProperty(nameof(objectToSerialize.Active)), context), Converters.Use.StringBitBoolean(objectToSerialize.Active, context)), new XmlBuilder.Element( Names.Use.CustomFieldNames(objectToSerialize.GetType().GetProperty(nameof(objectToSerialize.CustomDate)), context), Converters.Use.SimpleDate(objectToSerialize.CustomDate, context)), new XmlBuilder.Element( Names.Use.SnakeCase(objectToSerialize.GetType().GetProperty(nameof(objectToSerialize.RateCardId)), context), Converters.Use.Convertible(objectToSerialize.RateCardId.ToString(), context)) ); return dataContainer.ToString(); } } ``` Or something similar to that. The question is, do we even want this? Do we want to support this as an option or is it always on? --- Additional notes: --- These might be interesting libraries: - https://andrewlock.net/netescapades-enumgenerators-a-source-generator-for-enum-performance/
Marvin-Brouwer commented 1 year ago

https://github.com/andrewlock/StronglyTypedId/issues/102#issuecomment-1465037102

Marvin-Brouwer commented 1 month ago

https://lemire.me/blog/2024/07/05/scan-html-faster-with-simd-instructions-net-c-edition/?utm_source=newsletter.csharpdigest.net&utm_medium=newsletter&utm_campaign=why-and-how-to-execute-graphql-queries-in-net